c# - Entity Framework Core - 派生类的多个鉴别器

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

谁能阐明如何拥有多个鉴别器?

最佳答案

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

但是你可以构造它,让 Activity 有一个鉴别器,然后子类也有自己的鉴别器

或者做一个复杂的判别器

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

按照上面的思路——但是有了额外的值,现在在我们自己的代码库中有一堆像上面那样的值

关于c# - Entity Framework Core - 派生类的多个鉴别器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51427181/

相关文章:

c# - Entity Framework Core 2.1 - 自有类型和嵌套值对象

entity-framework-core - Entity Framework 核心 2.1 上的脚手架无键模型

c# - 在 Unity Inspector 中隐藏 EditorGUILayout.ObjectField 的 "Object Picker"?

C# EF6 回滚更改,EntityState.Unchanged 错误

c# - 2 外键作为主键使用 EF Core 2.0 Code First

Asp.Net 核心 : Add data to IdentityDbContext or use DbContext

c# - 寻找一种有效的方法来使用 Entity Framework Core 为每一行检索一组多对多子项

c# - 有没有办法从编译的 EXE(使用 Quest PowerGUI)正确访问 isnetworkdeployed 属性?

c# - 正则表达式查找和替换以换行标签

asp.net-core - 原始 SQL 如何针对 Entity Framework Core 上下文运行?