我正在尝试为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; }
有没有简单的方法来实现我想要的?哪个派生实体(历史表)生成一个表,该表包含与基类实体相同的列字段,但更改了键。
我感谢上面的代码非常天真,但我似乎无法找到类似帮助的博客文章。
答案 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
属性进行寻址。