2014-01-23 1 views
7

Im получает ошибку «недопустимое имя столбца„FeeLevel_LevelId“, который не имеет абсолютно никакого смысла, учитывая все свойства простых типов и нет FeeLevel ни LevelId объекта в этом объектеEF Code First - Недопустимое имя столбца

Итак. мой контекст:

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

РоКо:

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

это отображение:

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

В таблице базы данных:

enter image description here

и это не имеет отношения. Тем не менее, EF генерирует следующий 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:

Создание нового Fees2DbContext вскрышных из других DbSets "исправляет" проблему .... но я не знаю, почему ... никто этих классов/множеств связаны с рассматриваемым классом.

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

     } 
    } 
+0

Имеет ли объект 'FeeLevel' набор' MemberFeeDiscountLevel'? – Slauma

+0

Да, это соответствует обновлению 2 в ответ на ваш вопрос. Что здесь делает EF? Я не понимаю. – rism

ответ

10

FeeLevel.MemberFeeDiscountLevels Навигационное свойство и вводит отношения один-ко-многим между FeeLevel и MemberFeeDiscountLevel: A FeeLevel может иметь много MemberFeeDiscountLevels, что означает, в то же время, когда MemberFeeDiscountLevel имеет один FeeLevel. Хотя у вас нет свойства навигации и внешнего ключа в MemberFeeDiscountLevel, база данных должна иметь внешний ключ в таблице MemberFeeDiscountLevel, чтобы смоделировать это отношение. EF принимает имя FK по умолчанию как «связанное имя объекта + подчеркивание + имя первичного ключа» = FeeLevel_LevelId. Поскольку в таблице базы данных нет этого столбца, вы получаете исключение.

+0

O.k так где-то по пути, когда модели вышли из синхронизации, что имеет смысл, потому что я использовал инструменты Entity Framework Power, чтобы автоматически генерировать код, но явно пропустил обновление где-то. Спасибо. – rism