我正在编写一个使用Entity Framework 4和WCF数据服务的ASP.NET MVC 2应用程序。
我想根据一些复选框的状态操纵Duties和Workers之间的多对多(复合键)关系。
工人可能有零或多个职责。职责可能有零个或多个工人。
此代码来自我的一个控制器:
//
// POST: /Duty/Edit/5
[HttpPost]
public ActionResult Edit(Duty Model, FormCollection collection)
{
ctx.AttachTo("Duties", Model);
ctx.UpdateObject(Model);
// handle checkboxes
ctx.LoadProperty(Model, "Workers");
foreach (Worker w in ctx.Workers)
{
bool isChecked = collection[w.Id.ToString()].Contains("t");
bool wasChecked = Model.Workers.Contains(w);
if (isChecked && !wasChecked)
{
Model.Workers.Add(w);
}
else if (wasChecked && !isChecked)
{
Model.Workers.Remove(w);
}
}
ctx.SaveChanges();
return RedirectToAction("Index");
}
适当调用Add()
和Remove()
方法。这毫无例外地执行。但是,更改不会提交到我的数据库。为什么呢?
我尝试将其翻转到w.Duties.Add(Model);
,但这也无效。
答案 0 :(得分:5)
使用方法AddLink和DeleteLink。
//
// POST: /Duty/Edit/5
[HttpPost]
public ActionResult Edit(Duty Model, FormCollection collection)
{
ctx.AttachTo("Duties", Model);
ctx.UpdateObject(Model);
// handle checkboxes
foreach (Worker w in ctx.Workers.Expand("Duties"))
{
bool isChecked = collection[w.Id.ToString()].Contains("t");
bool wasChecked = w.Duties.Contains(Model);
if (isChecked && !wasChecked)
{
ctx.AddLink(Model, "Workers", w);
}
else if (wasChecked && !isChecked)
{
ctx.DeleteLink(Model, "Workers", w);
}
}
ctx.SaveChanges();
return RedirectToAction("Index");
}
请参阅MSDN文章Updating the Data Service (WCF Data Services)的创建和修改关系链接部分