我喜欢.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从数据库中完全重新加载模型。但这对我来说不会发生。模型属性不会从数据库加载。他们仍然是空的。
修改
我不明白为什么db.Entry(model).Reload();
失败了。但进一步阅读开始表明我应该在执行保存然后重新加载模型后处理dbcontext。这是真的?
修改
糟糕!我错了。我现在看到,当我提交更改db.SaveChanges()
时,我实际上覆盖了整个模型,而不仅仅是MVC控制器设置的属性。我必须有错误的模式。如何将新值(传递到我的控制器中)应用到我的数据库而不覆盖未修改的属性?我想这会变成一个非常有问题的问题。
结论
事实证明,Reload()会按预期更新。我的问题是,当我使用由控制器上下文自动实例化并作为参数传递给我的控制器方法的模型在dbcontext上调用SaveChanges时,我覆盖了我的数据库行。在这种情况下,它覆盖了已分配的属性以及未分配的属性。
我正在做一个选择
model = db.Models.Single(x => x.ID == modelID);
然后使用UpdateModel更新它(使用前缀调用以使其工作)
UpdateModel(model, "myPrefix");
db.SaveChanges();
答案 0 :(得分:0)
如果您只需要更新选定的属性,则必须手动执行:
db.YourEntitySet.Attach(model);
db.Entry(model).Property(m => m.SomeProperty).IsModifed = true;
// other properties here
db.SaveChanges();
在此之后你的重装会起作用,但是因为你想要重新加载模型你可以做到这一点:
var dbModel = db.YourEntitySet.Single(m => m.Id == model.Id);
dbModel.SomeProperty = model.SomeProperty;
// other properties here
db.SaveChanges();
而你dbModel
是“重新加载”的。您不能使用任何类似UpdateModel
的authomatic方法或应用当前值,因为它总是覆盖所有内容,包括客户未设置的值 - EF不知道什么是有效更改。