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

Navigation Property not being updated on db.SaveChanges()

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

工具模型包含名称为 HolderMobileUser 导航 属性,它还包含一个字符串 HolderName,用于在视图中设置支架.

在控制器方法中,我通过使用 Tool.HolderName == MobileUser.Name 获取用户来设置 MobileUser,但是在调用 db.SaveChanges() 之后 MobileUser 导航 属性 是数据库中没有变化。

我的代码:

ToolsController.Edit(工具工具):

        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);

工具class中的Holder导航属性:

    public virtual MobileUser Holder { get; set; }

首先,不要在你的控制器语音中使用实体模型(使用 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 将获取工具和支架,映射更改并保存,而不会暴露您的整个实体。

我最终放弃了,转而使用 GraphDiff。效果很好,如果以后有人遇到这个问题,我推荐它。