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
实体中覆盖 Equals
和 GetHashCode
,并将 HashSet
用于 Speciality.Practices
(在 POCO 的情况下)。它会为你处理重复。
这样的结果将是对联结表的多次删除和插入。这是 EF 的做法。
【讨论】:
@adymitruk:如果你想发布这样的cmets,你应该解释一下。 这是一件美好的事情,非常好。还要感谢有关覆盖 Equals 和 GetHashCode 的提示,我将添加这些提示。很好的答案,谢谢!【参考方案2】:不要使用多对多关系。无论如何,连接表最终都会保存更多数据。请改用一对多和多对一的组合。如果需要,您现在可以在中间实体中创建一个保存创建/修改日期的属性。
希望这会有所帮助。
【讨论】:
以上是关于EF如何更新多对多连接表的主要内容,如果未能解决你的问题,请参考以下文章