gpt4 book ai didi

.net - Reload() 不更新 EF 实体

转载 作者:行者123 更新时间:2023-12-02 05:10:06 24 4
gpt4 key购买 nike

我喜欢 .NET MVC 将实例化的类模型传递给 Controller ​​的做法,该 Controller 已经从发布的表单值中填充了一些属性。非常方便。

[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 Controller 设置的属性。我一定是弄错了模式。我如何将新值(传递到我的 Controller 中)应用到我的数据库而不覆盖未修改的属性?我想这会变成一个非常无聊的问题。

结论

事实证明,Reload() 确实按预期更新了。我的问题是,当我使用由 Controller 上下文自动实例化并作为参数传递给我的 Controller 方法的模型在我的 dbcontext 上调用 SaveChanges 时,我正在覆盖我的 db 行。在这种情况下,它会覆盖已分配的属性和未分配的属性。

我现在正在做一个选择

model = db.Models.Single(x => x.ID == modelID);

然后使用 UpdateModel 更新它(使用前缀调用以使其工作)

UpdateModel(model, "myPrefix");
db.SaveChanges();

最佳答案

如果您只需要更新选定的属性,则必须手动执行:

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 或应用当前值,因为它总是覆盖所有内容,包括您的客户端未设置的值 - EF 不知道什么是有效更改。

关于.net - Reload() 不更新 EF 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6565058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com