c# - 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?
解决方案
您可以简单地通过在子类上放置 Table 属性来指定映射表名称来创建 TPT 映射
modelBuilder.Entity<BillOfQuantitiesChangeLog>().ToTable("BillOfQuantitiesChangeLog");
modelBuilder.Entity<CreditCard>().ToTable("CreditCards");
推荐阅读
- javascript - 在同一页面中管理创建和更新方法时如何在php中管理依赖下拉列表
- c++ - 结构指针如何区分相同指针的使用?
- vulkan - 确定输入附件在着色器中是否有效
- reactjs - goBack 与 useHistory react-router-dom 触发旧结果 api
- datepicker - 日期选择器,如果没有可用日期,则显示下个月
- kubernetes - 从 Docker Desktop 上运行的 Kubernetes 集群中清除持久卷
- css - 导航的主体对齐问题
- discord - 解禁未定义
- arrays - 以日期形式转换秒数 Numpy Python
- matlab - 使用 rank1 、 BFGS 和 DFP 算法和准牛顿法在 powell 函数上获得相同的性能是否正常