EF TPT пытается сопоставить одну таблицу - PullRequest
1 голос
/ 03 мая 2019

У нас есть базовая таблица ChangeLog и две производные таблицы BillOfQuantitiesChangeLogMap и ProjectChangeLogMap:

CREATE TABLE [Global].[ChangeLogs](
   [Id] [bigint] IDENTITY(1,1) NOT NULL,
   [FieldName] [nvarchar](50) NOT NULL,
   [OldValue] [nvarchar](2000) NULL,
   [NewValue] [nvarchar](2000) NULL,
   ...

CREATE TABLE [Projects].[BillOfQuantitiesChangeLogs](
   [Id] [bigint] NOT NULL,
   [ExtraField] [nvarchar](2000) NULL,
   ...

CREATE TABLE [Projects].[ProjectChangeLogMap](
   [Id] [bigint] NOT NULL,
   ...

Они добавляются в dbcontext следующим образом:

 modelBuilder.Configurations.Add(new ChangeLogMap());
 modelBuilder.Configurations.Add(new BillOfQuantitiesChangeLogMap());
 modelBuilder.Configurations.Add(new ProjectChangeLogMap());

... которые определены одинаково, например:

public class ChangeLogMap : EntityTypeConfiguration<ChangeLog>
{
    public ChangeLogMap()
    {
        ToTable("ChangeLogs", "Global");

        Property(t => t.FieldName)
            .IsRequired();
        Property(t => t.OldValue);
        Property(t => t.NewValue);
    }
}

Производная сущность наследуется от базовой сущности:

public class BillOfQuantitiesChangeLog : ChangeLog
{
   ...
}

Теперь, когда мы сохраняем экземпляр BillOfQuantitiesChangeLog, все работает нормально.

Однако, когда в dbcontext мы добавляем только два отображения, например:

 modelBuilder.Configurations.Add(new ChangeLogMap());
 modelBuilder.Configurations.Add(new BillOfQuantitiesChangeLogMap());

... затем сохранение BillOfQuantitiesChangeLog приводит к сообщению об ошибке, что «ExtraField» не может быть найден. Поэтому я предполагаю, что он пытается сопоставить BillOfQuantitiesChangeLog с одной таблицей, а не с двумя таблицами.

Мой вопрос: почему EF не применяет TPT, если мы добавляем только одно отображение производного класса в контекст?

1 Ответ

0 голосов
/ 03 мая 2019

Вы можете создать сопоставление TPT, просто поместив атрибут Table в подклассы, чтобы указать имя сопоставленной таблицы

 modelBuilder.Entity<BillOfQuantitiesChangeLog>().ToTable("BillOfQuantitiesChangeLog");
 modelBuilder.Entity<CreditCard>().ToTable("CreditCards");

С полной документацией можно ознакомиться здесь https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...