C# · 12月 27, 2021

c# – 实体框架DB-First,实现继承

我试图使用实体框架6.0和数据库第一种方法实现继承.好的,假设我有个人和组织实体,如下所示: // a simplified version of organization entitypublic class Organization{ public Guid ID { get; set; } public string Nickname { get; set; } public string Email { get; set; } public string PhoneNumber { get; set; } public string OfficialName { get; set; } public Guid CEOID { get; set; } public DateTime? RegisterDate { get; set; }}// a simplified version of person entitypublic class Person{ public Guid ID { get; set; } public string Nickname { get; set; } public string Email { get; set; } public string PhoneNumber { get; set; } public Guid PersonID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string MiddleName { get; set; } public string NationalCode { get; set; } public DateTime? BirthDate { get; set; }}

我可以在数据库中创建这两个表,但是我想使用继承,所以在Person和Organization中重复的字段可以在另一个基类中,如下所示:

public class Identity{ // These fields are the common fields between Person and Organization public Guid ID { get; set; } public string Nickname { get; set; } public string Email { get; set; } public string PhoneNumber { get; set; }}

如何在db-first方法中实现这一点?

解决方法 一种可能的方法是使用一种称为TPT(每种类型表)的表,我喜欢使用它.要实现这一点,您可以像下图所示的模型来定义表:

请注意,子基础实体之间的关系在其pk列上是一对一的,所有常用字段都将移动到基表.创建表后,右键单击可视化工作室中的模型页面,然后从“数据库…”中选择“更新模型”,然后在“添加”选项卡中,选择要添加的3个表.起初你应该看到这个模型图,需要改变一下:

对人员和组织分别执行以下步骤:

>右键单击实体,然后选择“属性”
>在Base Type属性中选择Identity
>选择然后删除此实体与身份之间的关联
>选择然后删除该实体的PK(ID列)(从基本实体继承)

这些步骤之后,保存您的模型.现在你的模型应该是这样的:

现在编译你的项目,享受你的生活!

附:我感谢任何人可以编辑我的答案并解释实体框架中的TPH(每层次分层)继承.

希望这可以帮助.