【发布时间】:2013-06-20 08:56:25
【问题描述】:
我有一个EF 4 POCO DbContext 并在DataGrid (System.Windows.Controls.DataGrid) 中显示一个表。
- 我可以
SaveChanges存储在DataGrid中所做的更改。 - 我可以
Reload()获取其他用户更新的数据(即我使用SQL Management Studio)。 - 然后我可以看到其他用户的数据
但是,如果我尝试执行 1 然后 2(即在网格中进行更改,SaveChanges,然后另一个用户更改数据然后我重新加载)我得到一个 InvalidOperationException .
这种情况仅在通过网格更改文本时发生,而不是在通过代码更改数据时发生。
我可以安静地吞下异常,然后查看更新的数据。但是,如果不了解发生了什么,我宁愿不这样做......
发生了什么事?
完全的例外是……
发生 System.InvalidOperationException H结果=-2146233079 调用 Message=EntityMemberChanged 或 EntityComplexMemberChanged,而无需先在具有相同属性名称的同一更改跟踪器上调用 EntityMemberChanging 或 EntityComplexMemberChanging。有关正确报告更改的信息,请参阅实体框架文档。 源=系统.数据.实体 堆栈跟踪: 在 System.Data.Objects.EntityEntry.EntityMemberChanged(字符串 entityMemberName,对象 complexObject,字符串 complexObjectMemberName) 在 System.Data.Objects.EntityEntry.EntityMemberChanged(字符串 entityMemberName) 在 System.Data.Objects.ObjectStateEntry.System.Data.Objects.DataClasses.IEntityChangeTracker.EntityMemberChanged(字符串 entityMemberName) 在 System.Data.Objects.Internal.SnapshotChangeTrackingStrategy.SetCurrentValue(EntityEntry 条目,StateManagerMemberMetadata 成员,Int32 序数,对象目标,对象值) 在 System.Data.Objects.Internal.EntityWrapper
1.SetCurrentValue(EntityEntry entry, StateManagerMemberMetadata member, Int32 ordinal, Object target, Object value) at System.Data.Objects.EntityEntry.SetCurrentEntityValue(StateManagerTypeMetadata metadata, Int32 ordinal, Object userObject, Object newValue) at System.Data.Objects.ObjectStateEntryDbUpdatableDataRecord.SetRecordValue(Int32 ordinal, Object value) at System.Data.Objects.EntityEntry.UpdateRecord(Object value, DbUpdatableDataRecord current, UpdateRecordBehavior behavior, Int32 propertyIndex) at System.Data.Objects.Internal.SnapshotChangeTrackingStrategy.UpdateCurrentValueRecord(Object value, EntityEntry entry) at System.Data.Objects.Internal.EntityWrapper1.UpdateCurrentValueRecord(对象值,EntityEntry 条目) 在 System.Data.Common.Internal.Materialization.Shaper.UpdateEntry[TEntity](IEntityWrapper WrapperEntity,EntityEntry existingEntry) 在 System.Data.Common.Internal.Materialization.Shaper.HandleEntity[TEntity](IEntityWrapper WrapperEntity,EntityKey entityKey,EntitySet entitySet) 在 lambda_method(闭包,Shaper) 在 System.Data.Common.Internal.Materialization.Coordinator1.ReadNextElement(Shaper shaper) at System.Data.Common.Internal.Materialization.Shaper1.SimpleEnumerator.MoveNext() 在 System.Data.Objects.ObjectContext.BatchRefreshEntitiesByKey(RefreshMode refreshMode, Dictionary2 trackedEntities, EntitySet targetSet, List1 targetKeys, Int32 startFrom) 在 System.Data.Objects.ObjectContext.RefreshEntities(RefreshMode refreshMode,IEnumerable 集合) 在 System.Data.Objects.ObjectContext.Refresh(RefreshMode refreshMode,对象实体) 在 System.Data.Entity.Internal.InternalEntityEntry.Reload() 在 System.Data.Entity.Infrastructure.DbEntityEntry.Reload() 在 c:\projects\MyProject\Chilli.Model\ObjectContext_Refresh.cs:line 19 中的 Chilli.Model.ObjectContext.SafeReload(Object o) 内部异常:
【问题讨论】:
-
类似问题stackoverflow.com/q/8044554/1341477 我会查看答案中的链接,但要避免像他那样使用代理...
-
谢谢戴夫!我确实想知道代理是否在 Reload() 期间没有调用 PropertyChanging 和 PropertyChanged 事件...这并没有阻止我花费 2 天时间重新编写整个应用程序以使用 INotifyProperyChanging 以及 INotifyPropertyChanged
我可以测试 -
我在softwaremechanik.wordpress.com/2013/06/21/… 发布了一些测试代码,但我无法在测试中重现效果。无论如何,感谢您的帮助戴夫,请添加它作为答案,我会接受它...
-
没问题希望它有所帮助。
标签: wpf entity-framework datagrid poco