WCF数据服务与EF4的多对多关系

Zac*_*son 2 linq wcf many-to-many entity-framework wcf-data-services

我正在编写一个使用Entity Framework 4和WCF Data Services的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");
}
Run Code Online (Sandbox Code Playgroud)

Add()Remove()方法适当地调用.这毫无例外地执行.但是,更改不会提交到我的数据库.为什么?

更新

我试过把它翻过来w.Duties.Add(Model);,但也不起作用.

Zac*_*son 5

使用方法AddLinkDeleteLink.

//
// 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");
}
Run Code Online (Sandbox Code Playgroud)

请参阅MSDN文章更新数据服务(WCF数据服务)的" 创建和修改关系链接"部分