EF如何更新多对多连接表

Posted

技术标签:

【中文标题】EF如何更新多对多连接表【英文标题】:EF how to update many to many join table 【发布时间】:2011-03-17 21:29:22 【问题描述】:

我无法让 Entity Framework 4 处理 m2m 连接中的批量更新。我的模型中有几个多对多连接,例如

练习 练习ID PK 名字...

PracticeSpecialties(连接表) 练习ID PK 专业 ID PK

专业 专业 ID pk 名字...

相当基本,EF 4 处理得很好。我的问题是我需要能够将 2 个或多个专业“合并”为 1 个,例如“儿科”、“儿童”和“青少年”都应该是同一个项目。因此,如果 Pediatrics 的 SpecialtyID 为 1,Children = 3 和 Adolescents = 9,则查询应该对 PracticeSpecialties 中 SpecialtyID IN (3, 9) 的所有行执行更新,并将值更改为 1。

我可以编写一个存储过程来更新连接表中包含不需要的 SpecialtyID 之一的所有行,然后删除所有现在孤立的 Specialties,但如果可能的话,我会尝试坚持使用 EF 模式。

感谢任何指导。

【问题讨论】:

【参考方案1】:

在实体框架中,您必须以对象方式执行=您可以简单地修改连接表。您必须使用导航属性中的对象。您的场景将如下所示:

var children = context.Specialities.Include("Practices")
                      .Single(s => s.Name == "Children");
var pediatrics = context.Specialities.Include("Practices")
                        .Single(s => s.Name == "Pediatrics");

foreach (var practice in children.Practices)

  pediatrics.Practices.Add(practice);


children.Practices.Clear();
context.Specialities.DeleteObject(children);
context.SaveChanges();

您还应该在 Practice 实体中覆盖 EqualsGetHashCode,并将 HashSet 用于 Speciality.Practices(在 POCO 的情况下)。它会为你处理重复。

这样的结果将是对联结表的多次删除和插入。这是 EF 的做法。

【讨论】:

@adymitruk:如果你想发布这样的cmets,你应该解释一下。 这是一件美好的事情,非常好。还要感谢有关覆盖 Equals 和 GetHashCode 的提示,我将添加这些提示。很好的答案,谢谢!【参考方案2】:

不要使用多对多关系。无论如何,连接表最终都会保存更多数据。请改用一对多和多对一的组合。如果需要,您现在可以在中间实体中创建一个保存创建/修改日期的属性。

希望这会有所帮助。

【讨论】:

以上是关于EF如何更新多对多连接表的主要内容,如果未能解决你的问题,请参考以下文章

EntityFramework同一张表多对多关系

如何使用 EF6 更新多对多表

如何直接填充由 EF Core 生成的多对多关系连接表?

如何使用同一个连接表创建多个多对多关系 [EF7/Core]

ORM表多对多的操作

孩子不会更新 Xamarin SQLite 扩展 - 多对多关系