导航 属性 未在 db.SaveChanges() 上更新
Navigation Property not being updated on db.SaveChanges()
我有一个编辑控制器方法,它从编辑视图中获取 Tool
。
工具模型包含名称为 Holder
的 MobileUser
导航 属性,它还包含一个字符串 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。效果很好,如果以后有人遇到这个问题,我推荐它。
我有一个编辑控制器方法,它从编辑视图中获取 Tool
。
工具模型包含名称为 Holder
的 MobileUser
导航 属性,它还包含一个字符串 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。效果很好,如果以后有人遇到这个问题,我推荐它。