使用 EF Code First 继承 – 每个类型的表 (TPT)

Posted

技术标签:

【中文标题】使用 EF Code First 继承 – 每个类型的表 (TPT)【英文标题】:Inheritance with EF Code First – Table per Type (TPT) 【发布时间】:2014-12-18 04:34:46 【问题描述】:

我正在尝试使用 Table per Type 方法通过 EF Code First 进行继承。我的实际结构是这样的:

public partial class Person

    public int ID get; set;
    public string Name  get; set; 


public partial class Employee : Person

    public int ID  get; set; 
    public string Document get; set; 

以这种结构为例,我可以这样做:

var obj = new Employee();
string a = obj.Name;   <--- The property Name is from Person model

然而,用相反的方式做这种关系是不可能的(就像在 LINQ 中所做的那样):

var obj2 = new Person();
string b = obj2.Person.Document;    <--- It cannot resolve 'Person' symbol

有没有办法从 Employee 对象访问模型 Person?

提前致谢。

【问题讨论】:

所有Employee 都是Person,但并非所有Person 都是Employee 所有Banana 都是Fruit 但并非所有Fruit 都是Banana 是的。这是正确的。但有些人是雇员。必须有办法知道我是否可以从人员访问员工模型。像 objEmployee.Person != null 吗? ((objEmployee)Person).Name : string.Empty;类似的东西 【参考方案1】:

正如大家在 cmets 中提到的那样,Person 不是员工,不能访问员工属性。您可以使用“as”运算符,如果它是员工,它将把一个人转换为一个员工对象,如果它不是一个员工,它将为空。

希望以下内容能让您朝着正确的方向前进:

var obj2 = new Person();
string b;

var employee = obj2 as Employee;
if (employee != null)

    b = obj2.Person.Document;

在这种情况下,Person 永远不会是雇员,因为它是在之前创建的

【讨论】:

以上是关于使用 EF Code First 继承 – 每个类型的表 (TPT)的主要内容,如果未能解决你的问题,请参考以下文章

EF Code First“无效的列名'Discriminator'”但没有继承

EF中的Code First

无法在EF Code First中创建复合主键

EF Code First外键关系

ef code first 怎样指定哪些类生成数据表?那些不生成数据表?

EF Code-First如何使用复合键从表中读取A.