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

entity framework5 – 为什么在PropertyValue设置回Original后实体状态为“已修改”分享

时间:2023-04-10 13:28:40 C#

C#学习教程:实体框架5-为什么在PropertyValue设置回Original后,实体状态为“Modified”使用(TestDbContextcontext=newTestDbContext()){stringname=context.Person.First().Name;//计数为0intcount=context.ChangeTracker.Entries().Count(e=>e.State==EntityState.Modified);//改变值context.Person.First().Name="Test";//计数为1count=context.ChangeTracker.Entries().Count(e=>e.State==EntityState.Modified);//还原值context.Person.First().Name=name;context.ChangeTracker.DetectChanges();//计数为1count=context.ChangeTracker.Entries().Count(e=>e.State==EntityState.Modified);}为什么??因为实体框架只跟踪数据是否被修改,而不是它与原始内容有何不同。当实体没有改变时,我们使用一个漂亮的方法将状态重置为未修改:.GetObjectStateEntry(实体);DbDataRecordorig=state.OriginalValues;CurrentValueRecordcurr=state.CurrentValues;布尔改变=假;for(inti=0;i请注意,此方法适用于EF4.0,不适用于DbContext较新版本。但是重写它以使用EF4.1+没有问题,我自己完成了,但我现在找不到代码.感谢提示:)这是我针对EF5(DbContext)的解决方案。我为来自ChangeTracker.Entries()的每个DbEnityEntry调用此方法如果(entry.OriginalValues.PropertyNames.Any(propertyName=>!entry.OriginalValues[propertyName].Equals(entry.CurrentValues[propertyName])))返回;(this.dbContext作为IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity).ChangeState(EntityState.Unchanged);}在User1481065建立在答案的基础上,为了克服在任何OriginalValues为null时出现异常的可能性,请尝试以下操作。我假设一个上下文可能包含多个可能有更新的实体(可能不一定是价值的实际变化)。_dirty=FalseDimoChangesAsIEnumerable(OfDbEntityEntry(OfCsSetting))=_dbContext.ChangeTracker.Entries(OfCsSetting)().Where(Function(r)r.StateEntityState.Unchanged)对于每个c作为DbEntityEntry(OfCsSetting)在oChanges_dirty=c.OriginalValues.PropertyNames.Any(Function(n)(c.OriginalValues(n)IsNothingandc.CurrentValues(n)IsNotNothing)OrElse(c.OriginalValues(n)IsNotNothingAndAlsoNotc.OriginalValues(n).Equals(c.CurrentValues(n))))If_dirtyThenExitForNextcReturn_dirty你可能不需要循环,所以你需要预设_dirty。以上就是C#学习教程的全部内容:实体框架5——为什么将PropertyValue设置回Original后,实体状态为“已修改”。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: