Entity Framework Table на наследование классов

1

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

Есть ли простой способ добиться того, чего я хочу? Который является производным объектом (таблица истории), генерирует таблицу, которая содержит те же поля столбцов, что и объект базового класса, но с изменением ключа.

Я ценю, что мой код выше довольно наивный, но я не могу найти сообщение в блоге, похожее на помощь.

  • 1
    Лол спасибо? Я прочитал все эти посты, но ни один из них действительно не помог с тем, что мне нужно, или хочу, это может быть невозможно, конечно. Но всегда лучше услышать это от эксперта, чем тратить время на дергание за волосы.
Теги:
entity-framework
inheritance
entity-framework-6

1 ответ

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.

  • 0
    Хорошо ... Так что, если история наследует, скажем, от бронирования, она будет содержать все те же поля, и я могу установить ключи отдельно. Я попробую.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню