EF Code First - Invalid column name

Im getting the error message "Invalid column name" FeeLevel_LevelId ", which makes no sense at all, given that all properties are simple types and there is no FeeLevel object or LevelId object in this object.

So 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(); } } } 

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() { } } 

This mapping is:

  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"); } } 

Database Table:

enter image description here

and he has no relationship. However, EF generates the following 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:

Creating a new Fees2DbContext file that removes other DbSets "fixes" the problem ... but I don’t know why ... none of these classes / sets is related to the class 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(); } } } 

UPDATE 2:

  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); } } 
+7
ef-code-first entity-framework-6
source share
1 answer

FeeLevel.MemberFeeDiscountLevels is a navigation property, and it introduces a one-to-many relationship between FeeLevel and MemberFeeDiscountLevel : A FeeLevel can have many MemberFeeDiscountLevels , which means at the same time that a MemberFeeDiscountLevel has one FeeLevel . Although you do not have the navigation property and foreign key in MemberFeeDiscountLevel , the database must have a foreign key in the MemberFeeDiscountLevel table to model this relationship. EF accepts the default FK name as "associated object name + underscore + primary key name" = FeeLevel_LevelId . Since the database table does not have this column, you get an exception.

+10
source share

All Articles