Reload() 不更新 EF 实体

2024-05-01

我喜欢 .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();

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

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();

And you dbModel作为“重装上阵”的。您不能使用任何自动方法,例如UpdateModel或应用当前值,因为它总是覆盖所有内容,包括客户端未设置的值 - EF 不知道什么是有效的更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Reload() 不更新 EF 实体 的相关文章

  • 将日期时间转换为时间

    我有一个对象 2 17 2011 6 46 01 PM 我想将此对象转换为 6 46 PM string myDateString 2 17 2011 6 46 01 PM DateTime datetime DateTime Parse
  • PhotoChooserTask 抛出未处理的异常

    我已经有了这段代码 我使用它来显示一个按钮 该按钮允许用户从他的库中选择图像并将其用作我的应用程序的背景 所以我创建了一个PhotoChooserTask 将其设置为显示相机并将其绑定到任务完成时必须执行的方法 该按钮将通过显示PhotoC
  • .NET 标准消息实际上与用于通用消息发送的 .NET Framework BrokeredMessage 不兼容吗?

    我可以指出的最好的地方之一是这个线程 https github com Azure azure service bus dotnet issues 239 https github com Azure azure service bus d
  • DLL 中的 GUID (.Net)

    我在这方面不是很有经验 所以我有几个问题 首先 所有 Net 创建的 DLL 是否都有自己的 GUID 如果没有 我的问题是如何获得一个并将其与 DLL 关联 那么问题是 我如何获得该 dll 的 GUID 即 给定 DLL 路径 c so
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 为什么处置/关闭 WCF 客户端代理很重要

    我听说即使在以下情况下也必须处置 或关闭 WCF 客户端代理 你没有使用会话 没有需要确定性清理的非托管资源 例如打开的套接字 例如 当使用具有默认绑定配置的 BasicHttpBinding 时 即使在流行的网页中也应该没问题 对吧 va
  • .NET 中非常奇怪的 SSL 错误:仅针对特定 URL 无法解密指定数据

    我正在使用 NET 从 URL 下载数据 对于大多数 URL 它都没有问题 但对于一个特定的 URL 当我尝试建立连接时 我收到一个非常奇怪的错误 此外 该错误仅在第二次 及后续 尝试发出请求时发生 第一次似乎总是有效 这是一些演示该问题的
  • 使用 .Net 创建 CalDAV 服务

    我想在我的应用程序中创建一个外部用户可以查看的日历 CalDAV 基本上是 WebDAV iCalendar 格式似乎得到了相对广泛的支持 尽管某些客户端 例如 Outlook 不太支持这种格式 不过对我来说完全是新的 我想外部发布事件 我
  • 在同一进程中混合 .NET 3.5 与 4/4.5 程序集

    我想将基于 NET 3 5 WinForms 的应用程序迁移到最新的 NET 版本 4 5 该应用程序使用当前也基于 NET 3 5 的 外部 组件 可以视为插件 我想知道我们转换时使用哪些运行时 核心库仅应用程序使用 NET 4 5 进行
  • 如何使用 XmlSerializer 在大文档中插入节点

    我有一个很大的 XML 文档 我想使用XmlSerializer类来插入新元素 其内容来自使用 xsd exe 生成的 NET 类实例 这是问题的后续如何使用 XmlSerializer 反序列化大型文档中的节点 https stackov
  • 如何衡量字符串的复杂度?

    我有一些长字符串 1 000 000 个字符 每个字符串仅包含定义字母表中的符号 例如 A 1 2 3 示例字符串 string S1 1111111111 meta complexity 0 string S2 1111222333 me
  • 依赖注入:没有为此对象定义无参数构造函数

    我正在尝试使用依赖项注入 NET Framework 4 6 ASP NET MVC 但收到错误 No parameterless constructor defined for this object 如果我还提供一个无参数构造函数Hom
  • 如何解决“指定的包含路径无效”?

    我有一个相当基本的亲子关系设置 最终结果是我希望能够通过 ASP NET MVC WebAPI 以 JSON 形式返回结果表 我正在使用实体框架 5 0 beta 2 我可以用一个简单的例子来演示我遇到的错误 鉴于课程Category an
  • 根据日期和时间计算下一次运行任务的时间

    我有一个相当具体的问题 根据该任务的配置 找出计算程序中的 任务 下次运行时间的最佳方法 从配置此 任务 的一些事物的定义开始 首先 一个看起来很像框架的枚举DayOfWeek枚举 我称之为DaysOfWeek并将其标记为FlagsAttr
  • C# Winform - 当用手指在触摸屏上移动到控件末尾时如何防止移动整个窗口

    我正在开发用于触摸屏的全屏 winform 应用程序 当我在表单上有任何控件时 例如listbox webBrowserControl 它具有可见的滚动条 有要滚动的内容 当我用手指移动到控件的末尾时 完整的表单向上 向下移动取决于移动方向
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • 实体框架代码优先 - 在另一个文件中配置

    使用 Fluent API 将表到实体的映射分开的最佳方法是什么 以便它全部位于单独的类中 而不是内联在 OnModelCreating 方法中 我目前在做什么 public class FooContext DbContext prote
  • 字节到二进制字符串 C# - 显示所有 8 位数字

    我想在文本框中显示一个字节 现在我正在使用 Convert ToString MyVeryOwnByte 2 但是 当字节开头有 0 时 这些 0 就会被删除 例子 MyVeryOwnByte 00001110 Texbox shows g
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI

随机推荐