导航属性未在db.SaveChanges()上更新

时间:2017-12-15 14:34:27

标签: c# asp.net asp.net-mvc entity-framework navigation-properties

我有一个编辑控制器方法,从编辑视图中获取Tool

工具模型包含名称为MobileUser的{​​{1}}导航属性,它还包含一个字符串Holder,用于在视图中设置持有者。

在控制器方法中,我通过向用户HolderName设置MobileUser,但在调用Tool.HolderName == MobileUser.Name之后,db.SaveChanges()导航属性不是数据库中的更改。

我的代码:

ToolsController.Edit(工具工具):

MobileUser

Tool类中的Holder导航属性:

        int id = db.MobileUsers.Single(x => x.Name == tool.HolderName).Id;
        tool.Holder = db.MobileUsers.Find(id);

        if (ModelState.IsValid)
        {
            db.Entry(tool).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(tool);

2 个答案:

答案 0 :(得分:0)

首先,必要的不要在控制器语音中使用实体模型(使用ViewModels),然后再显示模型。 IAC,试试这个:

[HttpPost]
public ActionResult Edit(Tool tool):

    if (ModelState.IsValid)
    {
        // If you want to update fields in tool.Holder, do something like this:
        var newHolder = tool.Holder;  // save changes from view.
        // Fetch the current Holder from database
        tool.Holder = db.MobileUsers.Single(x => x.Name == tool.HolderName);
        // Replace the changed properties. Many ways to do this. I like Automapper.
        tool.Holder.Field1 = newHolder.Field1;
        tool.Holder.Field2 = newHolder.Field2;
        // etc.

        db.Entry(tool).State = EntityState.Modified;
        // Below not needed since you getched it into the context
        // db.Entry(tool.Holder).State = EntityState.Modified;  // Need to set child state as well
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(tool);
}

在ViewModel场景中,您的POST将获取工具和持有者,映射更改并保存,而不会暴露整个实体。

答案 1 :(得分:0)

我最终放弃了并使用了GraphDiff。工作得很好,如果有人在将来遇到这个问题我会推荐它。