首先在实体框架代码中继承TPT

时间:2016-10-17 08:13:35

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

实体框架 codefirst中使用每种类型的表格(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表并将其与Person表相关联之外,我们还可以创建Note表并在{{1}之间创建1对多的关系表和那个。

但是使用继承创建所有外键而不是像你看到的那样使用虚拟属性是标准吗?!

Doctors

2 个答案:

答案 0 :(得分:0)

您只想从Doctor派生,当您需要通过向其添加其他属性来展开Doctor类型时,让我们说Surgeon

在您的情况下,您是否想要向医生附上单个或多个注释,仅仅是任何类型医生的另一个财产。

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

答案 1 :(得分:0)

  

我们可以创建Note表并在它们之间创建1对多的关系   医生表和那个。

如果Note继承自Doctor,那么从Note到Doctor有一个1/0到1的关系,而不是1到多。

即使你的目标是创建1/0到1的关系,你也应该只使用继承来实现真正代表“是一种”的关系。 “注意是医生”并没有真正意义。

要在没有继承的情况下完成1/0到1的关系,请使用共享主键,您可以填写其他许多问题。 Note和Doctor都有相同的主键。即医生ID 45将具有Id 45的注释。由于Note是关系的可选1/0侧,因此您的FK约束将来自引用Doctor表的Note表。这意味着您无法插入带有Id 46的注释,除非已存在具有Id 46的医生。