簡體   English   中英

每個類繼承的實體框架表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM