Я пытаюсь реализовать таблицу истории для объекта в 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 { }
Таблица My 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
.