我有两个实体Alpha
和Beta
,它们之间有M:M的关系。
我正在尝试向Beta
添加一些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
按预期填充。
答案 0 :(得分:1)
属性alpha.Betas
必须启用延迟加载。即它应该是虚拟的,延迟加载和代理生成一定不能在上下文中关闭。
原因是EF必须知道“旧”集合才能检测到它的后续更改。
如果集合是延迟加载,则语句alpha.Betas.Clear();
将首先加载集合并立即清除它。 (alpha
必须已附加到上下文中。)
如果您不希望延迟加载,则必须先手动加载它:
context.Entry(alpha).Collection(x => x.Betas).Load();
在删除/添加项目之前。
设置EntityState.Modified
不起作用,因为它只影响标量属性(没有导航属性)。如果alpha
本身没有更改,则可以删除该语句。但是,您仍然必须将alpha
附加到上下文中。