未添加多对多关系

问题描述:

我有两个实体,AlphaBeta,它们之间有M:M的关系。未添加多对多关系

我想一些Beta s添加到一个Alpha像这样:

public ActionResult Edit(Alpha alpha) 
{ 
    if (ModelState.IsValid) 
    { 
    var selectedBetaIds = //populated from checkboxes in the view 

    var selectedBetas = db.Betas.Where(b => selectedBetaIds.Contains(b.Id)); 

    alpha.Betas.Clear(); 

    foreach (var b in selectedBetas) 
     alpha.Betas.Add(b); 

    db.Entry(alpha).State = EntityState.Modified; 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
    } 
    return View(alpha); 
} 

但表AlphaBetas没有添加到它和任何alpha.Betas.Count() == 0任何条目。

奇怪的是在db.SaveChanges()以上的方法中,在调试时,Betas按预期填充。

属性alpha.Betas必须启用延迟加载。即它应该是虚拟的,并且延迟加载和代理生成不能在上下文中关闭。

原因是EF必须知道“旧”收集才能检测到后续更改。

如果该集合是延迟加载,则语句alpha.Betas.Clear();将首先加载该集合并立即清除该集合。 (alpha必须已经附加到上下文中)。

如果你不希望它是延迟加载,你必须首先手动加载:

context.Entry(alpha).Collection(x => x.Betas).Load(); 

删除/添加项目之前。

设置EntityState.Modified不能完成这项工作,因为它只影响标量特性(无导航属性)。如果alpha本身没有变化,则可以删除该声明。但是,您仍然必须将alpha附加到上下文中。

+0

谢谢!问题是我不能在'db.SaveChanges()'之前调用它,因为'alpha'尚未加载。处理这个问题的最好方法是什么? – 2013-04-22 14:06:14

+0

啊......在顶部调用'db.Alphas.Attach(alpha)'。简单。谢谢! – 2013-04-22 14:09:06