EF Code First - Invalid column name

ef-code-first entity-framework-6

Question

The error "Invalid column name 'FeeLevel LevelId'" that I receive is completely illogical given that all of the properties are simple types and that neither a FeeLevel nor a LevelId object exists in this object.

Thus, my context is:

  public partial class FeesDbContext : DisconnectedEntityContext
    {

        public DbSet<Currency> Currencies { get; set; }

        public DbSet<FeeLevel> FeeLevels { get; set; }

        public DbSet<FeeLevelDetail> FeeLevelDetails { get; set; }

        public DbSet<FeeType> FeeTypes { get; set; }

        public DbSet<MemberFeeDiscountLevel> MemberFeeDiscountLevels { get; set; }

        public FeesDbContext()
            : base("FeesDb") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new FeeLevelMap());
            modelBuilder.Configurations.Add(new FeeLevelDetailMap());
            modelBuilder.Configurations.Add(new FeeTypeMap());
            modelBuilder.Configurations.Add(new CurrencyMap());
            modelBuilder.Configurations.Add(new MemberFeeDiscountLevelMap());
        }

        public static void ApplyChanges<TEntity>(TEntity root)
                    where TEntity : class, IObjectWithState
        {
            using (var context = new FeesDbContext())
            {
                context.Set<TEntity>().Add(root);
                foreach (var entry in context.ChangeTracker.Entries<IObjectWithState>())
                {
                    IObjectWithState stateInfo = entry.Entity;
                    entry.State = ConvertState(stateInfo.State);
                }
                context.SaveChanges();
            }
        }
}

It is the POCO:

public partial class MemberFeeDiscountLevel : AbstractState
    {

        public long MemberFeeDiscountLevelId { get; set; }
        public System.Guid MemberId { get; set; }
        public short MemberAsType { get; set; }
        public long FeeDiscountLevelId { get; set; }
        public System.DateTime FeeDiscountLevelAppliedDate { get; set; }
        public Nullable<System.DateTime> FeeDiscountLevelExpiresDate { get; set; }
        public Nullable<long> FallbackFeeDiscountLevelId { get; set; }
        public System.Guid UserId { get; set; }
        public System.DateTime LastModified { get; set; }


        public MemberFeeDiscountLevel(ObjectState state) : base(state) { }

        public MemberFeeDiscountLevel()
        {
        }
    }

It maps as follows:

  public class MemberFeeDiscountLevelMap : EntityTypeConfiguration<MemberFeeDiscountLevel>
    {
        public MemberFeeDiscountLevelMap()
        {
            // Primary Key
            this.HasKey(t => t.MemberFeeDiscountLevelId);

            this.Ignore(t => t.State);

            // Properties
            // Table & Column Mappings
            this.ToTable("MemberFeeDiscountLevel");
            this.Property(t => t.MemberFeeDiscountLevelId).HasColumnName("MemberFeeDiscountLevelId");
            this.Property(t => t.MemberId).HasColumnName("MemberId");
            this.Property(t => t.MemberAsType).HasColumnName("MemberAsType");
            this.Property(t => t.FeeDiscountLevelId).HasColumnName("FeeDiscountLevelId");
            this.Property(t => t.FeeDiscountLevelAppliedDate).HasColumnName("FeeDiscountLevelAppliedDate");
            this.Property(t => t.FeeDiscountLevelExpiresDate).HasColumnName("FeeDiscountLevelExpiresDate");
            this.Property(t => t.FallbackFeeDiscountLevelId).HasColumnName("FallbackFeeDiscountLevelId");
            this.Property(t => t.UserId).HasColumnName("UserId");
            this.Property(t => t.LastModified).HasColumnName("LastModified");
        }
    }

The database table is called:

enter image description here

and it doesn't have any connections. However, EF is producing the subsequent SQL:

exec sp_executesql N'INSERT [dbo].[MemberFeeDiscountLevel]([MemberId], [MemberAsType], [FeeDiscountLevelId], [FeeDiscountLevelAppliedDate], [FeeDiscountLevelExpiresDate], [FallbackFeeDiscountLevelId], [UserId], [LastModified], [FeeLevel_LevelId])
VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, NULL)
SELECT [MemberFeeDiscountLevelId]
FROM [dbo].[MemberFeeDiscountLevel]
WHERE @@ROWCOUNT > 0 AND [MemberFeeDiscountLevelId] = scope_identity()',N'@0 uniqueidentifier,@1 smallint,@2 bigint,@3 datetime2(7),@4 datetime2(7),@5 bigint,@6 uniqueidentifier,@7 datetime2(7),@8 int',@0='DAF771D1-079F-4743-B5C7-FD0FA1C63E19',@1=0,@2=1012,@3='2014-01-24 12:05:36.0608347',@4='2014-02-01 00:00:00',@5=1018,@6='EEDF2C83-2123-4B1C-BF8D-BE2D2FA26D09',@7='2014-01-24 12:05:36.0608347'
go

UPDATE:

The problem can be "fixed" by creating a new Fees2DbContext and stripping out the other DbSets, but I'm not sure why as none of these classes or sets are related to the one in question.

 public partial class Fees2DbContext : DisconnectedEntityContext
    {
        public DbSet<MemberFeeDiscountLevel> MemberFeeDiscountLevels { get; set; }

        public Fees2DbContext()
            : base("FeesDb") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new MemberFeeDiscountLevelMap());
        }

        public static void ApplyChanges<TEntity>(TEntity root)
                    where TEntity : class, IObjectWithState
        {
            using (var context = new Fees2DbContext())
            {
                context.Set<TEntity>().Add(root);
                foreach (var entry in context.ChangeTracker.Entries<IObjectWithState>())
                {
                    IObjectWithState stateInfo = entry.Entity;
                    entry.State = ConvertState(stateInfo.State);
                }
                context.SaveChanges();
            }
        }
    }

2ND UPDATE

       public partial class FeeLevel : AbstractState
        {
            public FeeLevel()
            {
                this.FeeLevelDetails = new List<FeeLevelDetail>();
                this.MemberFeeDiscountLevels = new List<MemberFeeDiscountLevel>();
            }

            public long LevelId { get; set; }

            public string LevelName { get; set; }

            public int CurrencyId { get; set; }

            public System.DateTime LastModified { get; set; }

            public bool IsSystemOwned { get; set; }

            public System.Guid UserId { get; set; }

            public virtual Currency Currency { get; set; }

            [ScriptIgnore]
            public virtual ICollection<FeeLevelDetail> FeeLevelDetails { get; set; }

            public virtual ICollection<MemberFeeDiscountLevel> MemberFeeDiscountLevels { get; set; }
        }

public class FeeLevelMap : EntityTypeConfiguration<FeeLevel>
    {
        public FeeLevelMap()
        {
            // Primary Key
            this.HasKey(t => t.LevelId);

            this.Ignore(t => t.State);

            // Properties
            this.Property(t => t.LevelId);
            // .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

            this.Property(t => t.LevelName)
                .IsRequired()
                .HasMaxLength(50);

            // Table & Column Mappings
            this.ToTable("FeeLevel");
            this.Property(t => t.LevelId).HasColumnName("LevelId");
            this.Property(t => t.LevelName).HasColumnName("LevelName");
            this.Property(t => t.CurrencyId).HasColumnName("CurrencyId");
            this.Property(t => t.LastModified).HasColumnName("LastModified");
            this.Property(t => t.UserId).HasColumnName("UserId");

            // Relationships
            this.HasRequired(t => t.Currency)
                .WithMany(t => t.FeeLevels)
                .HasForeignKey(d => d.CurrencyId);

        }
    }
1
10
1/23/2014 11:50:48 PM

Accepted Answer

FeeLevel.MemberFeeDiscountLevels is a navigational characteristic that establishes a one-to-many connection betweenFeeLevel and MemberFeeDiscountLevel : AFeeLevel can have a lotMemberFeeDiscountLevels which simultaneously means that aMemberFeeDiscountLevel has only oneFeeLevel . Despite the fact that you lack a navigation and foreign key property inMemberFeeDiscountLevel There must be a foreign key in the database.MemberFeeDiscountLevel table to represent this connection. The default FK name used by EF is "primary key name + associated entity name + underscore" =FeeLevel_LevelId You receive the exception because this field does not exist in your database table.

13
1/24/2014 12:02:02 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow