【问题标题】:Configuring a property with inheritance配置具有继承的属性
【发布时间】:2023-02-02 23:43:10
【问题描述】:

我有一个类似于以下的类:

public class MainClass
{
    public int Id { get; set; }
    public ChildType ChildType { get; set; }
    public IChildData? Data { get; set; }
}

ChildType 是一个枚举。有一些(但不是全部)值的 IChildData 的实现。

我正在为映射配置而苦苦挣扎。

我认为我应该使用鉴别器,但我不知道如何判断鉴别器是针对属性而不是MainClass

这行不通:

var config = modelBuilder.Entity<MainClass>();
config.HasDiscriminator(x => x.ChildType).HasValue<SomeChild>(ChildType.SomeValue);

它抱怨 SomeChild 类没有继承 MainClass。我怎样才能让英孚明白这是为了孩子的财产?

【问题讨论】:

  • 不应该是var config = modelBuilder.Entity&lt;SomeBaseImplementorOfIChildData&gt;();之类的吗?
  • 还有什么是所需的表结构? MainClass fk 到IChildData 数据表了吗?
  • 但是 ChildType 属性在“MainClass”中而不是孩子?
  • MainTainable 有一个 Child Type 列,Sum Child 表有一个到 MainTable 的外键。
  • 那么这种关系是一对多的(一个 MainClass 到多个子数据)?

标签: c# entity-framework-core


【解决方案1】:

否。每个 MainTable 行都有零个或一个子表,其中 MainTable.ChildType 决定从哪个子表加载

基于此评论,您希望在主表中使用类似多态外键的子类型进行 TPC/TPT 继承,这是 AFAIK 至少某些 SQL 数据库本身不支持,这使得它在英孚核心。

我建议重新考虑您的数据库设计。根据提供的信息table-per-hierarchy 看起来是一个合适的解决方案:

public class MainClass
{
    public int Id { get; set; }
    public ChildDataBase? Data { get; set; }
}

public class ChildDataBase
{
    public int Id { get; set; }
    public ChildType ChildType { get; set; }
    public MainClass Main { get; set; }
}

请注意,1) EF Core AFAIK 不能很好地与实体接口配合使用,因此最好从一开始就引入基类 2) 仅 TPH 需要鉴别器,它是包含层次结构的表的属性 other inheritance patterns do不需要它并基于实体到表的映射进行操作。

如果您仍然想使用 TPC 或 TPT,那么您将需要依赖 EF Core 生成连接查询(如前所述 - 不使用鉴别​​器)或自己编写查询逻辑(可能无需设置关系并删除或标记相应的未映射的属性)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多