实体框架继承关联问题

时间:2010-10-05 09:17:34

标签: entity-framework inheritance associations

我正在尝试解决在使用我的项目实施EF时遇到的情况。

我已经解除了每个类型的表格方法,在我的例子中,ActionUpdate派生自ActionHistory并且工作正常。

我想要实现的是从ActionHistory派生ActionUpdate,并在ActionUpdate中拥有一个导航属性,该属性将包含一系列ActionUpdateDetail实体。

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

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

我的假设:

  1. 根本不可能达到这样的目的,
  2. 我只是一个试图以错误的方式做事的愚蠢的屁,
  3. 我注定要失败:)
  4. 问题的原因

    我认为重要的是,我与你分享我的痛苦的原因:)

    我直观地假设ActionUpdateDetail必须映射到ActionUpdate的Id,这是错误的。

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

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

1 个答案:

答案 0 :(得分:0)

可以在EF中使用每个类型的表继承,并使用您提供的示例,我将编写一些驱动程序。您只需按照以下步骤操作:

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