【发布时间】:2025-12-19 21:45:18
【问题描述】:
我有一个结构如下的模型(为简洁起见省略了字段):
public enum ActivityType { Production, Downtime }
public enum ActivityStatus { Planned Actual }
public abstract class Activity
{
public virtual ActivityType ActivityType {get;}
public virtual ActivityStatus ActivityStatus {get;}
}
public abstract class PlannedActivity : Activity
{
public override ActivityStatus ActivityStatus => ActivityStatus.Planned;
}
public abstract class ActualActivity : Activity
{
public override ActivityStatus ActivityStatus => ActivityStatus.Actual;
}
然后是具体的“实体”类
public class PlannedDowntime : PlannedActivity
{
public override ActivityType ActivityType => ActivityType.Downtime;
}
public class PlannedProduction : PlannedActivity
{
public override ActivityType ActivityType => ActivityType.Production;
}
public class ActualDowntime : ActualActivity
{
public override ActivityType ActivityType => ActivityType.Downtime;
}
public class ActualProduction : ActualActivity
{
public override ActivityType ActivityType => ActivityType.Production;
}
我正在尝试将所有数据保存到单个数据库表(即 TPH)。
在 EF6 中,以下代码实现了我正在寻找的数据库和模型结构:
modelBuilder.Entity<Activity>()
.Map<PlannedProductionActivity>(m =>
{
m.Requires("ActivityType").HasValue("Production");
m.Requires("ActivityStatus").HasValue("Planned");
})
.Map<PlannedDowntimeActivity>(m =>
{
m.Requires("ActivityType").HasValue("Downtime");
m.Requires("ActivityStatus").HasValue("Planned");
})
.Map<ActualProductionActivity>(m =>
{
m.Requires("ActivityType").HasValue("Production");
m.Requires("ActivityStatus").HasValue("Actual");
})
.Map<ActualDowntimeActivity>(m =>
{
m.Requires("ActivityType").HasValue("Downtime");
m.Requires("ActivityStatus").HasValue("Actual");
});
但是...我需要将其移至 EF Core (2.1),而我正在苦苦挣扎。以下代码是我能得到的最接近的代码,但是在迁移时它失败并出现错误“层次结构中的每个具体实体类型都需要具有唯一的鉴别器值。
modelBuilder.Entity<Activity>()
.HasDiscriminator<ActivityStatus>("ActivityStatus")
.HasValue<PlannedActivity>(ActivityStatus.Planned)
.HasValue<ActualActivity>(ActivityStatus.Actual);
modelBuilder.Entity<Activity>()
.HasDiscriminator<ActivityType>("ActivityType")
.HasValue<PlannedDowntimeActivity>(ActivityType.Downtime)
.HasValue<ActualDowntimeActivity>(ActivityType.Downtime)
.HasValue<PlannedProductionActivity>(ActivityType.Production)
.HasValue<ActualProductionActivity>(ActivityType.Production);
请任何人解释一下如何拥有多个鉴别器?
【问题讨论】:
-
您有 4 个实体,但模型构建器中只有 2 个部分,这正是您所拥有的吗?
-
是的,这就是所有的代码。这两个部分针对每个鉴别器“ActivityStatus”和“ActivityType”
标签: c# entity-framework-core entity-framework-core-2.1