Entity framework EF如何更新多对多联接表

Entity framework EF如何更新多对多联接表,entity-framework,many-to-many,Entity Framework,Many To Many,我在让EntityFramework4处理m2m连接中的批量更新时遇到问题。我的模型中有几个多对多连接,例如 练习 PracticeID PK 名字 实践特殊性(联接表) PracticeID PK 特殊标识PK 特产 特殊标识pk 名称… 非常基本,EF4处理得很好。我的问题是我需要能够将2个或更多的专业“合并”为1个,例如“儿科”和“儿童”以及“青少年”都应该是同一个项目。因此,如果Pediatrics的SpecialtyID为1,Children=3,adevents=9,那么查询应该对p

我在让EntityFramework4处理m2m连接中的批量更新时遇到问题。我的模型中有几个多对多连接,例如

练习
PracticeID PK
名字

实践特殊性(联接表)
PracticeID PK
特殊标识PK

特产
特殊标识pk
名称…

非常基本,EF4处理得很好。我的问题是我需要能够将2个或更多的专业“合并”为1个,例如“儿科”和“儿童”以及“青少年”都应该是同一个项目。因此,如果Pediatrics的SpecialtyID为1,Children=3,adevents=9,那么查询应该对practicesspecialties中SpecialtyID位于(3,9)中的所有行执行更新,并将该值更改为1

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


欢迎提供任何指导。

不要使用多对多关系。无论如何,联接表最终还是会保存更多的数据。改为使用一对多和多对一组合。如果你想要,你可以做一个在中间实体中保存创建/修改日期的属性。
希望这能有所帮助。

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

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();
您还应该覆盖
实践
实体中的
等于
获取hashcode
,并将
HashSet
用于
专业实践
(在POCO的情况下)。它会帮你处理口是心非的事情


这将导致对联接表进行多次删除和插入。这是一个很好的方法。

@adymitruk:如果你想发表这样的评论,你应该解释一下。这是一件很好的事情,非常好。同时也感谢您提供了关于覆盖Equals和GetHashCode的提示,我将添加它们。回答得很好,谢谢!