【问题标题】:Entity Framework STEs and many-To-many associations实体框架 STE 和多对多关联
【发布时间】:2011-10-26 13:38:05
【问题描述】:

我对 EF 和 STE 还很陌生,但最近我偶然发现了一个痛苦的点,我想知道其他人是如何处理它的...

例如,假设我有两个 STE:Employee 和 Project。这是一个多对多的关系。每个实体都有一个到另一个实体的导航属性(即 Employee.Projects 和 Project.Employees)。

在我的 UI 中,用户可以创建/编辑员工并将其与多个项目相关联。当用户准备好提交时,员工列表将被传递到服务器进行保存。但是,如果一个 Employee 没有被添加到“保存列表”(即它被丢弃),但与一个或多个项目建立了关联,则 ApplyChanges 扩展方法能够“复活”该 Employee 对象,因为它是“连接的” " 通过与项目的关联到对象图。

我的“保存”代码如下所示:

 public void UpdateEmployees(IEnumerable<Entities.Employee> employees)
 {
     using (var context = new EmployeeModelContainer(_connectionString))
     {
        foreach (var employee in employees)
        {
           context.Employees.ApplyChanges(employee);
        }

        context.SaveChanges();
     }
 }

通过使用 FK 来操作此处所述的关联,我现在已经能够在其他对象图上避免此问题:http://blogs.msdn.com/b/diego/archive/2010/10/06/self-tracking-entities-applychanges-and-duplicate-entities.aspx

当涉及到多对多关联和导航属性时,如何处理?

谢谢。

【问题讨论】:

  • 你如何解雇员工?您是否将其标记为已删除?可以显示该代码吗?
  • @Wouter de Kort 指出丢弃(不包括)实体没有任何意义。您必须将其显式设置为已删除,否则仍会通过对其他实体的引用进行跟踪。
  • 感谢您的回复!目前,通过“丢弃”,我的意思是我根本没有将它包含在传递给 save 方法的列表中。我同意你们两个。正如您所指出的,实体仍然可以通过对象引用进行跟踪,这会导致问题......也许将其标记为已删除是最好的方法。我想知道其他人是如何处理的。

标签: entity-framework c#-4.0 entity-framework-4 self-tracking-entities


【解决方案1】:

虽然这个答案迟了一年,但也许它会对您(或至少其他人)有所帮助

简单的答案是:不允许实体框架推断 m:m 关系。不幸的是,我不知道有什么方法可以防止这种情况,只知道事后如何处理它。

默认情况下,如果我有这样的架构:

Employee        EmployeeProject    Project
-----------     ---------------    ----------
EmployeeId ---> EmployeeId    |--> ProjectId
Name            ProjectId -----    Name
...                                ...

Entity Framework 将看到我的EmployeeProject 表是一个没有其他信息的简单关联表(例如,我可能会添加一个Date 字段来指示他们何时加入项目)。在这种情况下,它将关系映射到 association 而不是 entity。这使得代码很漂亮,因为它有助于减轻 RDBMS 和面向对象开发之间经常引用的阻抗不匹配。毕竟,如果我只是将它们建模为对象,我会以同样的方式编码,对吧?

然而,正如您所见,这可能会导致问题(即使不使用 STE,这会导致 m:m 关系出现更多问题)。那么,开发人员要做什么?

(以下假设采用 DATABASE FIRST 方法。其他任何事情,您都靠自己)

你有两个选择:

  • 在您的关联表中添加另一列,以便 EF 认为它具有更多含义并且无法将其映射到关联。当然,这是糟糕的设计,因为您可能不需要该列(否则您已经拥有它)并且您只是因为 ORM 的特殊特性而添加它'已经选择了。所以不要。

  • 生成上下文后,将关联表自己映射到您手动创建的实体。为此,请按照以下步骤操作:

    1. 在设计器中选择关联并将其删除。设计人员会通知您相关表格不再映射,并询问您是否要将其从模型中删除。 回答否
    2. 创建一个新实体(不要让它创建键属性)并将其映射到“映射详细信息”窗口中的关联表
    3. 右键单击新实体并添加关联
    4. 更正实体和多重性值(左侧应具有多重性为 * 的关联实体,右侧应具有多重性为 1 的其他实体)
    5. 选中“向实体添加外键属性”选项
    6. 对关联中的其他实体重复
    7. 修复关联实体上的属性名称(如果需要...不是绝对必要,但它们几乎肯定是错误的)并将它们映射到“映射详细信息”窗口中的相应列
    8. 选择关联实体上的所有标量属性,并在“属性”窗口中将它们设置为 EntityKey=True

完成!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2011-12-17
    相关资源
    最近更新 更多