大佬教程收集整理的这篇文章主要介绍了c# – 为什么Entity Framework会检测已修改但重置的属性的更改?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Property "Name": Value "Test" (original value) -> Value "Test123" (value changed by UI) -> Value "Test" (value changed by UI to original value)
已修改的条目:
var objectStateEntries = _db.objectStateManager.GetObjectStateEntries( EntityState.Added | EntityState.deleted | EntityState.Modified);
你怎么处理这个案子?
private String _name; public String Name { // ... set { // if (_name != value) such a check probably does not happen { _name = value; MarkPropertyAsModified(...); } } }
因此,没有与原始值进行比较,只能与@L_489_1@的当前值进行比较.如果此值发生更改,则无论是否将其重置为原始值,@L_489_1@都会标记为已修改.
(编辑和更正前一段:如果调用了setter,则该@L_489_1@被标记为Modified,无论是否分配了相同或更改的值.感谢Brad Thomas及其下面的评论!)
您可以通过在上下文选项中禁用此功能来避免创建动态代理:
objectContext.ContextOptions.ProxyCreationEnabled = false;
现在,更改检测将依赖于快照创建,这意味着EF会在调用更改检测时将原始值(存储在对象上下文中的快照中)与当前值进行比较.这不会在@L_489_1@设置器中发生,而是在Entity Framework的某些功能内部发生,例如在SaveChanges中.在您的情况下,这意味着当您调用SaveChanges原始值(快照)时,当前值将是相同的,因为您确实重置了更改.基本上,EF没有注意到您更改了@L_489_1@两次,并认为该@L_489_1@未更改.
请注意,禁用代理创建 – 如果您在全局范围内执行此操作(例如在上下文构造函数中),则可能会对您的应用程序进行深度更改.您可能拥有依赖于动态代理的代码才能正常工作,并且在各种情况下也会严重影响性能.存在动态代理以快速进行变更跟踪.基于快照的更改跟踪速度要慢得多.
以上是大佬教程为你收集整理的c# – 为什么Entity Framework会检测已修改但重置的属性的更改?全部内容,希望文章能够帮你解决c# – 为什么Entity Framework会检测已修改但重置的属性的更改?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。