实体框架DB-First,实现继承

Ash*_*kan 15 c# inheritance entity-framework ef-database-first

我正在尝试使用实体框架6.0和数据库第一种方法实现继承.好吧,假设我有一个像下面这样PersonOrganization实体:

// a simplified version of organization entity
public 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 entity
public 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; }
}
Run Code Online (Sandbox Code Playgroud)

我可以在数据库中创建这两个表,但我想用继承,以便它在重复两个领域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; }
}
Run Code Online (Sandbox Code Playgroud)

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

Ash*_*kan 22

一种可能的方法是为每种类型使用一个表,称为TPT(table-per-type),我更喜欢使用它.为此,您可以像下图所示的模型一样定义表:

表层次结构

请注意,子实体与基本实体之间的关系在其pk列上是一对一的,并且所有公共字段都将移动到基表.创建表格后,右键单击visual studio中的模型页面,然后选择"从数据库更新模型...",然后在"添加"选项卡中,选择要添加的这3个表.首先你应该看到这个模型图,需要稍微改变一下:

最初添加的表格

做这些步骤Person,并Organization分别:

  • 右键单击实体,然后选择" 属性"
  • Base Type属性中选择Identity
  • 选择然后删除此实体与之间的关联Identity
  • 选择然后删除此实体的PK(ID列)(从基础实体继承)

完成这些步骤后保存模型.现在您的模型应如下所示:

改变了的模型

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

其他资源:
实体框架设计器TPH继承

  • TPH仅表示每个基类1个表,并且一些屏蔽仅选择与特定类的基本属性和子类属性相关的列.连接数少得多,但是人口稀疏的列很多. (3认同)