Entity framework 实体框架继承关联问题

Entity framework 实体框架继承关联问题,entity-framework,inheritance,associations,Entity Framework,Inheritance,Associations,我正试图解决在我的项目中实施EF时遇到的一种情况 在我的例子中,ActionUpdate是从ActionHistory派生出来的,可以很好地工作 我试图实现的是从ActionHistory派生ActionUpdate,并在ActionUpdate上拥有一个导航属性,该属性将保存ActionUpdateDetail实体的集合 问题从继承开始:根据MSDN示例,当我从ActionUpdate中删除ActionHistoryId,然后从ActionHistory派生并重新映射时,ActionUpdat

我正试图解决在我的项目中实施EF时遇到的一种情况

在我的例子中,ActionUpdate是从ActionHistory派生出来的,可以很好地工作

我试图实现的是从ActionHistory派生ActionUpdate,并在ActionUpdate上拥有一个导航属性,该属性将保存ActionUpdateDetail实体的集合

问题从继承开始:根据MSDN示例,当我从ActionUpdate中删除ActionHistoryId,然后从ActionHistory派生并重新映射时,ActionUpdateId自动变成非PK属性

该行为阻止我映射到ActionUpdateDetail实体,因为我的新派生类不再包含PK: 我应该将ActionUpdate.ActionUpdateId映射到ActionUpdateDetail.ActionUpdateId

我的假设:

要么根本不可能实现这样的目标, 我只是个愚蠢的屁,想用错误的方式做事, 我命中注定: 问题的原因 我认为与你分享我痛苦的原因很重要:

我直觉地认为ActionUpdateDetail必须映射到ActionUpdate的Id,这是错误的

相反,它必须映射到ActionUpdate实体的ActionHistoryId属性,因为ActionUpdate派生自ActionHistory


这个小小的更改导致ActionUpdate表丢失了它的Id列,即它只包含ActionHistoryId列。之所以存在单列表,是因为ActionHistory是一个抽象实体,我需要一些东西,即ActionUpdate来保存ActionUpdateDetail实体集。

可以使用EF的每类型表继承,使用您提供的示例,我将编写一个小的驱动程序。您只需遵循以下步骤:

转到实体数据模型双击*.edmx 删除ActionUpdate和ActionHistory之间的关联 右键单击ActionHistory,添加>继承,选择ActionHistory作为基类,选择ActionUpdate作为派生类 删除ActionUpdateActionUpdateID的主键。它不再是PK并不重要,因为您将使用基类PK。从模型的角度来看,ActionUpdates将是ActionUpdateID的子集 打开Map Details窗口,选择ActionHistory,并使用ActionHistoryID字段映射数据库中的id。从现在起,该实体将使用其基类主键。 编译或验证模型,它应该可以工作 如果您对与ActionUpdate关联的ActionUpdateDetails有任何问题,您不应该知道,但您永远不知道EF有什么问题,您可以检查关联约束选择关联>属性面板
重要注意事项:要按类型继承生成表,基类和派生类必须建立1到0..1的关系。因此,您的模型在继承上不支持这种类型。为什么要从ActionHistory实体派生ActionUpdate实体?

嗨,Vintharas,首先我要感谢您详细而快速的回答:ActionHistory是一个抽象类。还有其他表/实体,如ActionTransferToDepartment或ActionTransferToUser。特定操作是更新操作,因为它应该映射到更新字段集。因此,ActionUpdate使用ActionHistory将1映射到1,并使用ActionUpdateDetail将1映射到多个。我会按照你的建议去做,但是我对第5步感到困惑,难道动作历史的Id不应该已经被映射了吗?很荣幸!如果ActionHistory是一个抽象类,那么您应该在模型中将其标记为抽象属性设置为true。关于步骤5:通常,实体的ActionUpdateID属性将映射到数据库上的列ActionUpdateID,当您在步骤4中从模型中删除该属性时,映射将无法解析。这就是为什么您必须输入并将其设置为实体从其基类继承的ActionHistoryID。您还必须知道,在EF4中,ActionUpdate将作为ActionHistory的子集工作,因此无论何时您想要进行查询,您都必须使用以下内容:var query=ctx.ActionHistory.OfType;