2011-03-17 25 views
0

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

实践
PracticeID PK
名称...

PracticeSpecialties(连接表)
PracticeID PK
SpecialtyID PK

专业
SpecialtyID pk
名称...

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

我可以写一个存储过程会更新做连接表中的所有行,包含不想要的SpecialtyID之一,然后删除所有现在孤立的特色,但如果可能,我试图坚持EF模式。

任何指导表示赞赏。

回答

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

你也应该在Practice实体覆盖EqualsGetHashCode和使用HashSetSpeciality.Practices(在波苏斯的情况下)。它会为你处理复杂性。

这样做的结果将是多次删除并插入到联结表中。这是EF方式来做到这一点。

+1

切换到NHibernate – 2011-03-17 23:10:59

+3

@adymitruk:你应该解释它,如果你想发布这样的评论。 – 2011-03-17 23:13:55

+0

这是一件美丽的事情,非常好。并且还要感谢关于覆盖Equals和GetHashCode的提示,我将添加这些内容。很好的答案,谢谢! – StuTheDog 2011-03-17 23:20:46

0

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

希望这会有所帮助。