每类继承的实体框架表

时间:2014-10-10 08:47:15

标签: c# sql entity-framework inheritance entity-framework-6

我正在尝试为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 个答案:

答案 0 :(得分: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属性进行寻址。