我有一个编辑控制器方法,从编辑视图中获取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);
答案 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。工作得很好,如果有人在将来遇到这个问题我会推荐它。