实体框架核心-多个派生类的鉴别器

时间:2018-07-19 15:58:48

标签: c# entity-framework-core entity-framework-core-2.1

我有一个结构如下的模型(为简洁起见,省略了字段):

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);

请问有人可以鉴别多个鉴别器吗?

1 个答案:

答案 0 :(得分:2)

好吧,需要两个鉴别器似乎有点奇怪-

但是您可以对其进行结构化,以使Activity具有一个标识符,然后子类也具有其自己的标识符

替代地使一个复杂的鉴别器

modelBuilder.Entity<Activity>()
.HasDiscriminator(x=> new {x.ActivityStatus, x.ActivityType})
.HasValue<PlannedDowntimeActivity>(new {ActivityStatus.Planned,ActivityType.Downtime} );

除了上面的几行以外-现在还有额外的值,现在在我们自己的代码库中都有一堆类似上面的