【问题标题】:Entity framework generates columns which are not needed based on inheritance实体框架基于继承生成不需要的列
【发布时间】:2019-05-16 12:41:37
【问题描述】:

我无法从我的模型中获取正确的数据库结构。我的模型有一些继承,这是 Entity Framework 无法自行解决的问题(我认为)。

类。我有多个非常相似的设置。只显示一个:

public class Answer {
    // ...
}


public class PartialAnswer {
    public int Id { get; set; }
    public int AnswerId { get; set; }
    public virtual Answer Answer { get; set; }
    // ...
}

public class PartialSortedAnswer : PartialAnswer {
    public string Key { get; set; }
    // ...
}

public class PartialRepeatingSortedAnswer : PartialSortedAnswer {
    public int Set { get; set; }
    // ...
}


public class MultipleAnswersRepeatingSorted : Answer {
    public virtual IEnumerable<Partials.PartialRepeatingSortedAnswer> Answers { get; set; }
}

我已经在我的上下文中使用此代码设置了继承的实体:

    builder.Entity<PartialSortedAnswer>();
    builder.Entity<PartialRepeatingSortedAnswer>();
    builder.Entity<MultipleAnswersRepeatingSorted>();
    // ...

创建迁移实体框架时会创建一个新表PartialAnswers。此表包含以下列:

  • 身份证
  • AnswerId
  • 鉴别器
  • 钥匙
  • 设置
  • MultipleAnswersRepeatingSortedId
  • ...

我了解所有列,这些都是基于我拥有的不同类型。我似乎唯一想不通的是最后的MultipleAnswersRepeatingSortedId 专栏。实体框架为此列创建与Answers 表的外键关系。为什么 EF 不使用已经定义的AnswerId

我尝试指定列名,但这似乎没有任何影响。

【问题讨论】:

    标签: c# .net entity-framework-core


    【解决方案1】:

    MultipleAnswersRepeatingSortedId 是属性 MultipleAnswersRepeatingSorted.Answers 中一对多关系的 FK。

    所以MultipleAnswersRepeatingSorted 1.....* PartialAnswer.
    这意味着我们可以拥有一个属性PartialAnswer.MultipleAnswersRepeatingSorted
    给我们 FK PartialAnswer.MultipleAnswersRepeatingSortedId


    PartialAnswer.AnswerId 基本上是指PartialAnswer *.....1 Answer
    这意味着您可以拥有与MultipleAnswersRepeatingSorted.Answers 不同的属性Answer.PartialAnswers


    我的建议是删除MultipleAnswersRepeatingSorted.Answers 属性并只定义Answer.PartialAnswers

    【讨论】:

    • 好的,我明白了。但是我可以让这个新的 FK 使用与 AnswerId 相同的列吗?由于MultipleAnswersRepeatingSortedAnswer,因此AnswerId 列和新列应始终具有相同的值。
    • 感谢您的回复!我发现我可以使用 InverseProperty 让它使用同一列。可悲的是,我只能对 4 种 Answer 中的 2 种执行此操作。不管我选择哪一个,最多只有 2 个。似乎是 EF Core 中的一个错误,因为我收到此错误:The convention invocations have reached the recursion limit. This is likely an issue in EF Core, please report it. 感谢您与我一起思考。我暂时将其保留为 2 个 InverseProperties,也许稍后再尝试让它们都使用同一列。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多