我有一個EF 4
POCO DbContext,並在DataGrid
(System.Windows.Controls.DataGrid)
中顯示了一個表格。EF WPF DataGrid重新加載導致InvalidOperationException:爲什麼?
- 我可以
SaveChanges
來存儲在DataGrid
中所做的更改。 - 我可以
Reload()
獲取其他用戶更新的數據(即我使用SQL Management Studio
)。 - 然後我就可以看到其他用戶的數據
但是,如果我嘗試做1 然後 2(即使在網格中的變化,SaveChanges
,其他用戶更改數據,那麼我刷新後)我得到一個InvalidOperationException
。
只有在通過網格更改文本時才發生這種情況,而不是在通過代碼更改數據時發生。
我可以悄悄吞下異常,然後看到更新的數據。不過,我寧願不這樣做,不知道發生了什麼事...
這是怎麼回事?
完整的例外是...
System.InvalidOperationException發生 的HResult = -2146233079 消息= EntityMemberChanged或EntityComplexMemberChanged被稱爲不首先使用相同的屬性名稱叫EntityMemberChanging或EntityComplexMemberChanging在同一個變化跟蹤器。有關正確報告更改的信息,請參閱實體框架文檔。 源= System.Data.Entity的 堆棧跟蹤: 在System.Data.Objects.EntityEntry.EntityMemberChanged(字符串entityMemberName,對象complexObject,字符串complexObjectMemberName) 在System.Data.Objects.EntityEntry.EntityMemberChanged(字符串entityMemberName) 在系統.Data.Objects.ObjectStateEntry.System.Data.Objects.DataClasses.IEntityChangeTracker.EntityMemberChanged(String entityMemberName) at System.Data.Objects.Internal.SnapshotChangeTrackingStrategy.SetCurrentValue(EntityEntry entry,StateManagerMemberMetadata member,Int32 ordinal,Object target,Object value ) at 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.EntityWrapper
1.UpdateCurrentValueRecord(Object value,EntityEntry entry) at System.Data.Common.Intern al.Materialization.Shaper.UpdateEntry [TEntity](IEntityWrapper wrappedEntity,EntityEntry existingEntry) at System.Data.Common.Internal.Materialization.Shaper.HandleEntity [TEntity](IEntityWrapper wrappedEntity,EntityKey entityKey,EntitySet entitySet) at lambda_method(Closure ,牛頭刨牀) 在System.Data.Common.Internal.Materialization.Coordinator1.ReadNextElement(Shaper shaper) at System.Data.Common.Internal.Materialization.Shaper
1.SimpleEnumerator.MoveNext() 在System.Data.Objects.ObjectContext.BatchRefreshEntitiesByKey(refreshMode refreshMode,字典2 trackedEntities, EntitySet targetSet, List
1個targetKeys,的Int32 startFrom) 在系統.Data.Objects.ObjectContext.RefreshEntities(RefreshMode refreshMode,IEnumerable collection) at System.Data.Objects.ObjectContext.Refresh(RefreshMode refreshMode,Object entity) at Sy在System.Data.Entity.Infrastructure.DbEntityEntry.Reload() at Chilli.Model.ObjectContext.SafeReload(Object o)in c:\ projects \ MyProject \ Chilli中的stem.Data.Entity.Internal.InternalEntityEntry.Reload() 。型號\ ObjectContext_Refresh。cs:line 19 InnerException:
類似問題http://stackoverflow.com/q/8044554/ 1341477,我會看看答案中的鏈接,但是避免了他所做的貶義代理... –
也可能是與此有關的任何東西http://connect.microsoft.com/VisualStudio/feedback/details/694567/entitymemberchanged-或-entitycomplexmemberchanged - 被稱爲 - 不先打電話,entitymembercha nging-or-entitycomplexmemberchanging-on-the-same-change-tracker-with-the-same-property-name –
謝謝戴夫!我確實懷疑代理是否在Reload()過程中沒有調用PropertyChanging和PropertyChanged事件...這並沒有阻止我花費2天重新編碼整個應用程序來使用INotifyProperyChanging以及INotifyPropertyChanged 我可以測試 –
ajd