0

0

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

月夜之吻

月夜之吻

发布时间:2025-12-19 08:58:02

|

632人浏览过

|

来源于php中文网

原创

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

ef core如何获取实体原始值 ef core originalvalues获取方法

在 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 转成键值对字典:

Lyrics Generator
Lyrics Generator

免费人工智能歌词生成器和人工智能歌曲作家

下载
  • var originalDict = entry.OriginalValues.ToDictionary(kvp => kvp.Metadata.Name, kvp => kvp.Value);
  • 配合 CurrentValues 可快速找出哪些字段被改过:
    var modifiedProps = entry.Properties
        .Where(p => !object.Equals(p.OriginalValue, p.CurrentValue))
        .Select(p => p.Metadata.Name)
        .ToList(); // 如 ["Title", "UpdatedAt"]

OriginalValues 在并发冲突中的作用

当使用乐观并发控制(如带 [ConcurrencyCheck]IsRowVersion() 的字段)时,EF Core 会在生成 UPDATE 语句时自动使用 OriginalValues 中的值做 WHERE 条件:

  • 例如:UPDATE Posts SET Title=@p0 WHERE Id=@p1 AND Version=@p2(@p2 来自 OriginalValues["Version"]
  • 若数据库中该行的 Version 已变,执行返回 0 行受影响,EF Core 抛出 DbUpdateConcurrencyException
  • 此时可在异常处理中访问 exception.Entries[0].OriginalValuesdatabaseValues 做合并决策

基本上就这些。OriginalValues 不复杂但容易忽略——关键记住它只对 ModifiedUnchanged 状态的已跟踪实体有效,且本质是只读快照。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

436

2024.03.01

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

348

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2074

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

347

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

255

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

410

2023.10.16

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

68

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 2.1万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号