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

时间:2014-03-08 00:18:50

标签: c# entity-framework inheritance ef-database-first

我正在尝试使用实体框架6.0和数据库第一种方法来实现继承。好吧,假设我有一个Person和一个Organization实体,如下所示:

// 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; }
}

我可以在数据库中创建这两个表,但我想使用继承,因此PersonOrganization中重复的字段可能位于另一个基类中,如下所示:

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方法中实现这一目标?

1 个答案:

答案 0 :(得分:21)

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

table hierarchy

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

tables added at first

分别为PersonOrganization执行以下步骤:

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

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

the changed model

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

其他资源:
Entity Framework Designer TPH Inheritance