首页 > 解决方案 > EF TPT 尝试映射到单个表

问题描述

我们有一个基表 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?

标签: c#entity-framework

解决方案


您可以简单地通过在子类上放置 Table 属性来指定映射表名称来创建 TPT 映射

 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


推荐阅读