[英]Entity Framework Table Per Class Inheritance
我正在嘗試先在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; }
有什么簡單的方法可以實現我想要的嗎? 哪個是派生實體(歷史表)會生成一個表,該表包含與基類實體相同的列字段,但鍵有所變化。
我很欣賞上面的代碼很幼稚,但是我似乎找不到類似的博客文章來提供幫助。
最好的方法是具有一個基本類型,實體及其歷史實體都將從該基本類型繼承:
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
屬性對其進行尋址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.