实体框架表每类继承(Entity Framework Table Per Class Inherit

2019-10-21 03:15发布

我想首先要实现一个历史表中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; }

有没有简单的方法来实现我想要什么? 这是所导出的实体(历史表)生成包含相同的列字段的基类实体的表,但键的改变。

我很感激我上面的代码是相当幼稚,但我似乎无法找到类似的博客文章,以帮助。

Answer 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从基本类型的所有属性MAPP该表为好。 其结果是,可以由两个分开的解决两个完全独立的表DbSet性质。



文章来源: Entity Framework Table Per Class Inheritance