当前位置: 首页 > 编程语言 > C#

实体框架DbContextSaveChanges()OriginalValueisincorrectlyshared

时间:2023-04-10 21:24:58 C#

入口问题。每当我尝试获取相关属性的OriginalValue时,它??的值始终与CurrentValue字段中的值相同。我首先使用此代码,并成功了解其他修改的条款:publicintSaveChanges(stringuserID){//尝试过使用和不使用以下行,并收到相同的结果://ChangeTracker.DetectChanges();foreach(varentinthis.ChangeTracker.Entries().Where(p=>p.State==System.Data.EntityState.Addedp.State==System.Data.EntityState.Deletedp.State==System.Data.EntityState.Modified)){//对于每条更改记录,获取审计记录条目并添加它们foreach(AuditLogloginGetAuditRecordsForChange(ent,userID)){this.AuditLog.Add(log);}}返回base.SaveChanges();}问题就在于此(缩写代码):privateListGetAuditRecordsForChange(DbEntityEntrydbEntry,stringuserID){if(dbEntry.State==System.Data.EntityState.Modified){foreach(stringpropertyNameindbEntry.OriginalValues.PropertyNames){if(!object.Equals(dbEntry.OriginalValues.GetValue(propertyName),dbEntry.CurrentValues.GetValue(propertyName))){//即使在//属性已更新。}//如果我将最初为“OldName”的属性“Name”更新为值“NewName”,然后在此处中断并通过调用检查值://?dbEntry.OriginalValues.GetValue(“Name”)。ToString()//结果将是“NewName”而不是预期的“OldName”}}}奇怪地调用dbEntry.Property(propertyName).IsModified();这种情况下会返回true只是OriginalValue中没有期望值。有人愿意帮我指出正确的方向吗?我似乎无法让它工作。当EF从数据库中检索实体时,它会对该实体的所有属性的原始值进行快照。之后,当对这些属性的值进行更改时,原值不变,当前值发生变化。但是,要使其发挥作用,EF需要在整个过程中跟踪实体。在web或其他n层应用程序中,向客户端发送值并处理用于查询实体的上下文是很常见的。这意味着EF现在不再跟踪该实体。这是很好的做法。一旦应用程序回发,实体将使用来自客户端的值重建,然后重新附加到上下文并设置为修改后的状态。但是,默认情况下,从客户端返回的唯一值是当前值。原始值丢失。通常这无关紧要,除非你在做乐观并发或者只是想更新真正改变过的值。在这些情况下,还应将原始值发送到客户端(通常作为Web应用程序中的隐藏字段),然后作为附加过程的一部分重新应用为原始值。这在上面的示例中没有发生,这就是原始值未按预期显示的原因。如果更改dbEntry.OriginalValues.GetValue(propertyName);到dbEntry.GetDatabaseValues().GetValue(propertyName);那么这个工作。以上就是C#学习教程的全部内容:entityframeworkDbContextSaveChanges()OriginalValueisincorrectlyshared。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: