未添加多对多关系
问题描述:
我有两个实体,Alpha
和Beta
,它们之间有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
附加到上下文中。
谢谢!问题是我不能在'db.SaveChanges()'之前调用它,因为'alpha'尚未加载。处理这个问题的最好方法是什么? – 2013-04-22 14:06:14
啊......在顶部调用'db.Alphas.Attach(alpha)'。简单。谢谢! – 2013-04-22 14:09:06