EF Core如何获取实体原始值 EF Core OriginalValues获取方法

admin 百科 11
EF Core 中 OriginalValues 用于获取实体从数据库加载时的原始值,仅对 Modified 或 Unchanged 状态的已跟踪实体有效,是只读快照,常用于审计、并发控制和变更对比。

EF Core如何获取实体原始值 EF Core OriginalValues获取方法-第1张图片-佛山资讯网

在 EF Core 中,获取实体的原始值(即从数据库加载时的初始值)主要通过 ChangeTrackerOriginalValues 属性实现。它适用于跟踪已修改但尚未保存的实体,常用于审计、并发控制或生成更新语句时对比变化。

通过 EntityEntry 获取 OriginalValues

当你有实体实例且它已被上下文跟踪时,先用 Entry() 获取其 EntityEntry,再访问 OriginalValues

  • 适用场景:实体已加载(如通过 Find() 或查询获得),且后续被修改过
  • 示例代码

    var post = context.Posts.Find(1);
    post.Title = "新标题";
    post.Content = "已更新内容";
    
    var entry = context.Entry(post);
    var originalTitle = entry.OriginalValues["Title"]; // 返回旧标题
    var originalContent = entry.OriginalValues["Content"]; // 返回旧内容

    登录后复制

  • 注意:若实体是新建(Added 状态),OriginalValues 为空(所有字段为 null 或默认值),因为没有“原始数据库值”

OriginalValues 是只读快照,不可直接修改

OriginalValues 是一个只读的属性快照,反映实体被加载时数据库中的值。你不能通过它来“重置”原始值或影响跟踪行为:

  • 调用 entry.OriginalValues["Title"] = "xxx" 不会改变原始值,也不会触发任何状态变更
  • 如需手动恢复原始值,应赋值给实体属性本身:post.Title = entry.OriginalValues["Title"].ToString();
  • 若想强制刷新原始值(例如模拟“放弃修改”),需重新查询或调用 entry.Reload()(会覆盖当前所有修改并重置 OriginalValues

批量获取所有原始值并转为字典

方便日志记录或对比分析时,可将 OriginalValues 转成键值对字典:

标签: 键值对

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~