我喜欢 .NET MVC 的做法,将实例化的类模型传递给控制器,该控制器已经从发布的表单值中填充了一些属性。非常便利。
[HttpPost]
public ActionResult DoTask(MyModel model)
模型到达时带有其 id 和从发布的表单数据中设置的其他属性。
但是,假设我想保存模型,然后访问仅存在于数据库中的其他属性。此时我需要重新加载模型。
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
db.Entry(model).Reload();
//model.relatedModel is empty, as are all other model fields not set by the post
我希望这会根据模型的 ID 完全从数据库重新加载模型。但这不会发生在我身上。模型属性不会从数据库加载。他们仍然是空的。
EDIT
我不懂为什么db.Entry(model).Reload();
对我来说失败了。但进一步的阅读开始表明我应该在执行保存然后重新加载模型后处理 dbcontext。这是真的?
EDIT
哎呀!我全都错了。我现在看到当我提交更改时db.SaveChanges()
我实际上覆盖了整个模型,而不仅仅是 MVC 控制器设置的属性。我一定是模式错误。如何将新值(传递到控制器中)应用到数据库而不覆盖未修改的属性?我想这已经变成了一个非常敏感的问题。
结论
事实证明,Reload() 确实按预期更新。我的问题是,当我使用由控制器上下文自动实例化并作为参数传递给我的控制器方法的模型在 dbcontext 上调用 SaveChanges 时,我正在覆盖我的数据库行。在这种情况下,它会覆盖已分配的属性以及未分配的属性。
我现在正在做一个选择
model = db.Models.Single(x => x.ID == modelID);
然后使用 UpdateModel 更新它(使用前缀调用以使其工作)
UpdateModel(model, "myPrefix");
db.SaveChanges();