Inheritance 如何向EntityDataModel(EF 4)中定义的对象添加继承?

Inheritance 如何向EntityDataModel(EF 4)中定义的对象添加继承?,inheritance,entity-framework-4,identity-column,table-per-type,Inheritance,Entity Framework 4,Identity Column,Table Per Type,我在EF模型中定义了一个简单的2对象继承,Person这是您的问题: 我有一个这个场景的测试用例,在这个场景中,系统找到一个它想要变成用户的人 对象不能更改类型,在C#或我知道的任何其他基于类的OOPL中。EF不会改变这一点 你需要改变你的设计。这不是OO。我去年: 在设计一个好的对象关系映射时,你必须克服的一个心理障碍是,你倾向于主要用面向对象的术语或关系术语来思考,以适合你的个性为准。但是,一个好的对象关系映射同时包含一个好的对象模型和一个好的关系模型。例如,假设您有一个数据库,其中包含用于

我在EF模型中定义了一个简单的2对象继承,Person这是您的问题:

我有一个这个场景的测试用例,在这个场景中,系统找到一个它想要变成用户的人

对象不能更改类型,在C#或我知道的任何其他基于类的OOPL中。EF不会改变这一点

你需要改变你的设计。这不是OO。我去年:

在设计一个好的对象关系映射时,你必须克服的一个心理障碍是,你倾向于主要用面向对象的术语或关系术语来思考,以适合你的个性为准。但是,一个好的对象关系映射同时包含一个好的对象模型和一个好的关系模型。例如,假设您有一个数据库,其中包含用于人员的表,以及用于员工和客户的相关表。一个人可能在所有三个表中都有一条记录。现在,从严格关系的角度来看,您可以为员工构建一个数据库视图,为客户构建另一个数据库视图,这两个视图都包含来自People表的信息。使用一个视图或另一个视图时,您可以暂时将个人视为“只是”员工或“只是”客户,即使您知道他们两者都是。因此,来自这个世界观的人可能会尝试进行OO映射,其中Employee和Customer都是Person的(直接)子类。但这与我们现有的数据不符;由于单个人员同时具有员工和客户记录(并且由于任何人员实例都不能同时属于具体的子类型employee和customer),因此人员和员工之间的OO关系需要是继承关系,而不是继承关系,对于人员和客户也是如此


我能够解决这个问题,尽管我对这个解决方案并不完全满意。最后,我编写了存储过程来映射Person和User的插入、更新和删除操作(因为它们位于同一个实体集中,所以必须使用所有3个存储过程映射)。User的insert存储过程接受PersonID参数,并使用它来决定是创建新的Person行,还是附加到现有的Person行

关键是PersonID必须映射为存储过程输入参数和结果列绑定。当db必须生成一个新的PersonID时,我们必须使用结果绑定将其取出来,以便其他表为引用PersonID的外键列获取正确的值。除了不能同时将User.PersonID映射为输入参数和结果列绑定。这导致运行时异常“无法确定依赖操作的有效顺序。依赖关系可能由于外键约束、模型要求或存储生成的值而存在。”

最后,我向用户表(以及相应的概念模型)添加了一个新列,它是一个可为null的int(我称之为BasePK)。在EDM中,我对该属性的getter和setter进行了保护,以便在公共接口中隐藏它们。然后,我将BasePK映射为存储过程输入参数,并将PersonID映射为结果列绑定,以便在生成标识值时接收标识值。用户构造函数的一个重载如下所示:

公共用户(int personID):base() { this.BasePK=personID; }

所以现在,每当我想把一个现有的人变成一个用户,我只需要用这个重载来构造这个用户

int personID=[搜索person并返回其personID的一些方法]; var User=新用户(personID)

当ObjectContext插入实体时,它通过BasePK属性将PersonID传递给存储过程。存储过程完成后,它将PersonID返回到实际的主键属性


我不喜欢必须添加一个列和属性来实现这一点,但这与我对Craig回答的评论是一致的:我希望能够插入具有新专业的Person,而无需每次更改/重新组合Person实体。这样,至少我可以保留派生实体类型中的所有更改,即使这意味着这些更改涉及添加在物理存储中始终为空的无意义列

如果我有名声的话,我会投票支持的。我的思维方式是在“用户就是一个人,而不是一个人拥有一个用户”的背景下。我回忆起5年前参加EER考试的具有不相交继承的个人数据类型,当时我在想,试图对其进行规范化是多么糟糕。我还是不明白为什么用作文更正确。在我的模型中,一个人可以单独存在,也可以作为用户、学生、教员、员工、校友等。每次创建一个新的专业人员时,必须更改基类(添加组合)似乎是不对的。我希望能够插入人而不改变它。