2014-10-10 97 views
1

我想實現EF6中的實體的歷史記錄表,首先代碼。實體框架表每個類的繼承

我想通過繼承來做到這一點。歷史表,它是實際表實體的派生類型,只包含所有屬性的直接副本。隨着密鑰的編輯。

我的代碼第一個表的實體配置爲Booking

public class BookingEntityConfiguration 
    : EntityTypeConfiguration<Booking> 
{ 
    public BookingEntityConfiguration() 
    { 
     Property(b => b.BookingId).HasColumnOrder(0); 
     HasKey(b => new { b.BookingId }); 

     HasOptional(b => b.BookingType) 
      .WithMany() 
      .HasForeignKey(c => c.BookingTypeId); 
    } 
} 

我的代碼第一個表實體BookingHistory配置。

public class BookingHistoryTypeEntityConfiguration 
    : EntityTypeConfiguration<BookingHistory> 
{ 
    public BookingHistoryTypeEntityConfiguration() 
    { 
     Property(b => b.BookingId).HasColumnOrder(0); 
     Property(b => b.BookingVersion).HasColumnOrder(0); 
     HasKey(b => new { b.BookingId, b.BookingVersion }); 
    } 
} 

public class BookingHistory : Booking { } 

BookingHistory表永遠不會在相關數據庫中的上下文中產生,其中包括這些引用表中的實體:

public DbSet<Booking> Bookings { get; set; } 
public DbSet<BookingHistory> BookingHistories { get; set; } 

有沒有什麼簡單的方法來實現我想要的是?哪個派生實體(歷史表)生成一個包含與基類實體相同的列字段但具有密鑰更改的表。

我很欣賞上面的代碼,非常天真,但我似乎無法找到類似於幫助的博客文章。

+1

LOL ...謝謝?我已經閱讀了所有這些帖子,但他們沒有一個真正幫助我滿足我的需求,或者想要,當然可能不可能。但是,從專家那裏聽到這比收拾頭髮更浪費時間更好。 – tigerswithguitars 2014-10-10 10:24:55

回答

1

,最好的辦法是有從同時在實體和它的歷史實體繼承基類型:

public class BookingsContext : DbContext 
{ 

    public DbSet<Booking> Bookings { get; set; } 
    public DbSet<BookingHistory> BookingHistories { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<BookingBase>() 
      .HasKey(p => p.BookingId) 
      .Property(p => p.BookingId) 
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

     modelBuilder.Entity<Booking>().Map(m => 
      { 
       m.MapInheritedProperties(); 
       m.ToTable("Booking"); 
      }); 

     modelBuilder.Entity<BookingHistory>().Map(m => 
      { 
       m.MapInheritedProperties(); 
       m.ToTable("BookingHistory"); 
      }); 
    } 
} 

通過ToTable您指定兩個實體應該映射到不同的表。最重要的是,MapInheritedProperties告訴EF將基本類型的所有屬性也映射到這個表中。結果是兩個完全獨立的表,可以通過兩個單獨的DbSet屬性來解決。

+0

好的......所以如果歷史從預訂中繼承,它將包含所有相同的字段,我可以單獨設置密鑰。我會放棄這一點。 – tigerswithguitars 2014-10-10 15:27:21