【问题标题】:TPT inheritance in entity framework code first实体框架代码中的TPT继承优先
【发布时间】:2016-10-17 08:13:34
【问题描述】:

通过在 Entity Framework codefirst 中使用 Table per Type (TPT) 继承,我们可以像这样创建外键:

    public abstract class Person
{

    public int id { get; set; }
    public string Name { get; set; }
    public string Family { get; set; }

}


[Table("Doctors")]

public class Doctor : Person
{
    public string ExpertTitle { get; set; }
}
[Table("Notes")]
public class Note : Doctor
{
    public string Content { get; set; }
}

在上面的代码中,除了创建Doctors 表并将其与Persons 表关联之外,我们还可以创建Note 表并在Doctors 表和那个之间创建一对多的关系。

但是该标准是使用继承而不是使用如下所示的虚拟属性来创建所有外键吗?!

public class Doctor : Per
{
    public string ExpertTitle { get; set; }

    public virtual ICollection<Note> Notes { get; set; }
}

public class Note : Doctor
{
    public string Content { get; set; }
    public virtual Doctor Doctor { get; set; }
}

【问题讨论】:

  • Doctor 派生Note 有意义吗?我会在逻辑上独立于 ORM 对您的类进行建模。您不会仅将继承用于创建关系。
  • 是的,你是对的......它只是一个示例代码......我的主要问题是:使用继承而不是使用虚拟属性创建所有外键是真的吗?
  • 不,你绝对不想这样做。此外,您只能通过这种方式创建 1-2-1 关系。
  • 感谢您的评论。

标签: entity-framework ef-code-first entity-framework-6 code-first table-per-type


【解决方案1】:

您只想从Doctor 派生,当您需要通过添加其他属性来扩展Doctor 类型时,比如说Surgeon

在您的情况下,无论您是想为医生附上一个或多个便条,这只是任何类型医生的另一个属性。

因此,您应该在 Doctor 类型中为单个注释添加可空/不可空字符串属性或复杂类型 Note,或者按照您自己的建议,Note 的集合每个都有自己的 ID .

【讨论】:

    【解决方案2】:

    我们可以创建 Note 表并在它们之间创建一对多的关系 医生桌之类的。

    如果 Note 继承自 Doctor,那么 Note 与 Doctor 之间的关系是 1/0 对 1,而不是 1 对多。

    即使您的目标是创建 1/0 对 1 的关系,您也应该只在继承真正代表“是”关系时才使用继承。 “Note is a Doctor”真的没有意义。

    要在没有继承的情况下实现 1/0 对 1 的关系,请使用共享主键,您可以找到很多其他问题。 Note 和 Doctor 都有相同的主键。 IE。 Doctor id 45 将具有 ID 45 的 Note。由于 Note 是关系的可选 1/0 侧,因此您的 FK 约束将来自引用 Doctor 表的 Note 表。这意味着您不能插入 ID 为 46 的注释,除非 ID 为 46 的医生已经存在。

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      相关资源
      最近更新 更多