【问题标题】:Map Discriminator Column to class Property Entity Framework Core 2.2.0将鉴别器列映射到类属性实体框架核心 2.2.0
【发布时间】:2020-02-20 13:48:17
【问题描述】:

我无法为 Entity Framework Core (v. 2.2.0) 生成迁移

我有一个由“MultipleChoiceQuestion”和“MatchColumns”类继承的“问题”类。我正在尝试使用 Entity Framework Core 构建 TPH(每个层次结构的表)继承。我的基类(Question)有一个属性“QuestionType”来区分子类。 “QuestionType”属性是一个枚举。我不希望 EF 生成鉴别器列,但使用属性“QuestionType”作为鉴别器列。

为了创建正确的迁移,我在 dbcontext 类中使用了以下代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Question>(b => b.HasDiscriminator(x => x.QuestionType).HasValue<MultipleChoiceQuestion>(QuestionType.MultipleChoiceQuestion).HasValue<MatchColumns>(QuestionType.MatchColumns));

    modelBuilder.Entity<Question>().Property(p => p.QuestionType).HasMaxLength(100).HasColumnName("QuestionType");
}

但是当我运行“添加迁移”时,我收到以下错误:

实体类型“问题”是层次结构的一部分,但没有配置鉴别器值。

无法弄清楚配置代码失败的原因。我查看了 Microsoft 的以下文档: https://docs.microsoft.com/en-us/ef/core/modeling/inheritance#discriminator-configuration

配置不完整/中断的任何指示?

TIA。

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    Question 中的任何一个都应该是抽象的。或者它应该是可能的记录类型之一,带有一个鉴别器值。

    【讨论】:

    • 感谢您的回答。将“问题”标记为抽象会创建迁移,但它现在会破坏 HTTP Post 上的模型绑定,因为类是抽象的。还有其他解决方法吗?
    • 首先你不应该通过 MVC 绑定数据实体,这就是视图模型的用途。 MVC 的默认绑定器需要在编译时知道每个属性的具体类型。您只能通过绑定到 MultipleChoiceQuestion 类型的变量来告诉 MVC 创建 MultipleChoiceQuestion 的实例。
    • 其实我用的是视图模型。我正在尝试创建一个允许教师从混合问题列表中选择问题的试卷(包含多项选择和 MatchColums)。当发布问题列表时,控制器获取一个视图模型对象,该对象又包含一个抽象问题类对象列表。
    • 好吧,您必须更改控制器以接受更具体的内容。例如 List&lt;QuestionWrapper&gt;public class QuestionWrapper{ public MultipleChoiceQuestion Multi {get; set;} public MatchColumns Match {get;set;}}
    猜你喜欢
    • 1970-01-01
    • 2016-04-08
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多