【问题标题】:Entity Framework inheritance association problem实体框架继承关联问题
【发布时间】:2010-10-05 09:17:34
【问题描述】:

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

我已经免除了每个类型的表格方法,在我的情况下,ActionUpdate 派生自 ActionHistory 并且工作正常。

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

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

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

我的假设:

  1. 要么根本不可能实现这样的事情,
  2. 我只是个想以错误方式做事的蠢屁,
  3. 我注定要失败 :)

问题的原因

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

我凭直觉推测 ActionUpdateDetail 必须映射到 ActionUpdate 的 Id,这是错误的。

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

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

【问题讨论】:

    标签: entity-framework inheritance associations


    【解决方案1】:

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

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

    重要提示:要使每个类型的表继承,基类和派生类必须建立 1 到 0..1 的关系。所以你的模型在继承时不支持这种类型。为什么要从 ActionHistory 实体派生 ActionUpdate 实体?

    【讨论】:

    • 您好 Vintharas,首先我要感谢您详细而快速的回复 :) ActionHistory 是一个抽象类。还有其他表/实体,例如 ActionTransferToDepartment 或 ActionTransferToUser。具体操作是更新操作,因为它应该映射到一组更新的字段。因此,ActionUpdate 使用 ActionHistory 将 1 映射到 1,并使用 ActionUpdateDetail 将 1 映射到多个。我会尝试按照您的建议进行操作,但是我对第 5 步感到困惑,不应该已经映射了 ActionHistory 的 Id 吗?
    • 很高兴!如果 ActionHistory 是一个抽象类,那么您应该在模型中将其标记为 Abstract 属性设置为 true。关于第 5 步:通常,实体的 ActionUpdateID 属性将映射到数据库上的 ActionUpdateID 列,因为您从模型中删除该属性(在第 4 步中)该映射将无法解析。这就是为什么您必须启动并将其设置为实体从其基类继承的 ActionHistoryID。
    • 您还必须注意,在 EF4 中,ActionUpdate 将作为 ActionHistory 的子集工作,因此无论何时您要进行查询,都必须使用如下内容: var query = ctx.ActionHistory.OfType ();
    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多