EF Core如何获取实体原始值 EF Core OriginalValues获取方法 ef core migration
EF Core 中 OriginalValues 用于从数据库加载时的原始值获取实体的原始值,仅对 Modified 或 Unchanged 状态的跟踪实体已有效,是震动,常审计、并发控制和变更对比。

在 EF Core 中,获取实体的原始值(即数据库加载时的原始值)主要通过 ChangeTracker 的 OriginalValues属性实现。它适用于跟踪已修改但尚未保存的实体,常用于审计、并发控制或生成更新语句时对比变化。通过EntityEntry获取OriginalValues
当你有实例实体时它已上下文跟踪时,且先用Entry()获取其EntityEntry,再访问OriginalValues:适用:场景加载(如通过Find()或查询获得),且后续被修改过 结束代码: var post = context.Posts.Find(1);post.Title = quot;新标题";;post.Content = quot;更新内容quot;;已添加条目 = context.Entry(post);var originalTitle =entry.OriginalValues[quot;Titlequot;]; // 返回旧var originalContent = entry.OriginalValues[quot;Contentquot;]; //返回旧内容登录后复制注意:若非新建(Added状态),OriginalValues为空(所有字段为null或默认值),因为没有“原始数据库值”OriginalValues是困扰标题,不可直接修改
OriginalValues是一个激烈的属性快照,反映实体被加载时数据库中的值。你不能通过它来“重置”原始值或影响行为跟踪:调用entry.OriginalValues[quot;Titlequot;] = quot;xxxquot;不会改变原始值,也恢复触发不会改变任何状态手动原始值,应赋予实体属性本身:post.Title = entry.OriginalValues[quot;Titlequot;].ToString();若想强制刷新原始值(如模拟“放弃修改”),需重新查询或调用entry.Reload()(会覆盖当前所有修改并重置 OriginalValues)批量获取所有原始值并转为字典
方便日志记录或对比分析时,可将OriginalValues转成键值对字典: Dream Machine
Dream Machine是由Luma AI开发的一款AI视频生成工具,可以快速将文本和图像转换为高质量的视频内容。
165查看详情 var originalDict =entry.OriginalValues.ToDictionary(kvp =gt;kvp.Metadata.Name,kvp =gt;kvp.Value);配合CurrentValues可快速查找哪些字段被改过:var moddedProps =entry.Properties .Where(p =gt;!object.Equals(p.OriginalValue,p.CurrentValue)) .Select(p =gt; p.Metadata.Name) .ToList(); // 如 [quot;Titlequot;, quot;UpdatedAtquot;]登录后复制 OriginalValues 在并发冲突中的作用
当使用乐观并发控制(如带 [ConcurrencyCheck] 或 IsRowVersion() 的字段)时,EF Core 会在生成 UPDATE 语句时自动使用 OriginalValues 中的值做 WHERE 条件:例如:UPDATE Posts SET标题=@p0 其中 Id=@p1 并且Version=@p2(@p2 来自 OriginalValues[quot;Versionquot;]) 如果数据库中该行的版本变了,执行返回 0 已行行,EF Core 抛出 DbUpdateConcurrencyException 此时可在异常处理中访问异常。Entries[0].OriginalValues 和 databaseValues 做合并决策
基本上就这些。OriginalValues 不复杂但容易忽略——关键记住只针对 Modified 或 Unchanged状态的已跟踪实体有效,且本质是令人震惊的。
以上就是EF Core如何获取原始值 EF Core OriginalValues获取方法的内容详细,更多请关注乐哥常识网其他相关! C#对象克隆方法避免在C# XML操作中的硬编码提高灵活代码与减少错误
