EF如何更新多对多的连接表

时间:2011-03-17 21:29:23

标签: entity-framework many-to-many

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

实践
  PracticeID PK
  名称...

PracticeSpecialties(连接表)
  PracticeID PK
  SpecialtyID PK


  SpecialtyID pk
  名称...

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

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

感谢任何指导。

2 个答案:

答案 0 :(得分:2)

在实体框架中,您必须以对象方式执行此操作=您只需修改联结表即可。您必须使用导航属性中的对象。您的方案将如下所示:

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();

您还应该覆盖Equals实体中的GetHashCodePractice,并使用HashSet作为Speciality.Practices(如果是POCO)。它将为您处理重复。

这将是对连接表的多次删除和插入。这是EF的方法。

答案 1 :(得分:0)

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

希望这有帮助。