通过在 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
表并将其与 Person
表相关联之外,我们可以创建 Note
表并在 Doctors
表与之间创建1对多关系 .
但是使用继承来创建所有外键而不是像你看到的那样使用虚拟属性的标准是什么?!
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; }
}
2 回答
您只想从
Doctor
派生,当您需要通过向其添加其他属性来扩展Doctor
类型时,假设Surgeon
.在您的情况下,无论您是要向医生附加单个或多个注释,仅仅是任何类型医生的另一个属性 .
因此,您应该在
Doctor
类型中为单个注释添加可空/不可空字符串属性或复杂类型Note
,或者如您自己所建议的那样,每个都有自己的ID的Note
集合 .如果Note继承自Doctor,那么从Note到Doctor有一个1/0到1的关系,而不是1到多 .
即使你的目标是创建1/0到1的关系,你也应该只使用继承来实现它真正代表“是一种”的关系 . “注意是医生”并没有真正意义 .
要在没有继承的情况下实现1/0到1的关系,请使用 shared primary key ,您可以填写其他许多问题 . Note和Doctor都有相同的主键 . 即医生ID 45将具有Id 45的注释 . 由于Note是关系的可选1/0侧,因此您的FK约束将来自引用Doctor表的Note表 . 意味着您无法插入ID为Id 46的注释,除非已存在具有Id 46的医生 .