2013-06-20 66 views
0

我有一個EF 4 POCO DbContext,並在DataGrid(System.Windows.Controls.DataGrid)中顯示了一個表格。EF WPF DataGrid重新加載導致InvalidOperationException:爲什麼?

  1. 我可以SaveChanges來存儲在DataGrid中所做的更改。
  2. 我可以Reload()獲取其他用戶更新的數據(即我使用SQL Management Studio)。
  3. 然後我就可以看到其他用戶的數據

但是,如果我嘗試做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.Coordinator 1.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:

+0

類似問題http://stackoverflow.com/q/8044554/ 1341477,我會看看答案中的鏈接,但是避免了他所做的貶義代理... –

+0

也可能是與此有關的任何東西http://connect.microsoft.com/VisualStudio/feedback/details/694567/entitymemberchanged-或-entitycomplexmemberchanged - 被稱爲 - 不先打電話,entitymembercha nging-or-entitycomplexmemberchanging-on-the-same-change-tracker-with-the-same-property-name –

+0

謝謝戴夫!我確實懷疑代理是否在Reload()過程中沒有調用PropertyChanging和PropertyChanged事件...這並沒有阻止我花費2天重新編碼整個應用程序來使用INotifyProperyChanging以及INotifyPropertyChanged 我可以測試 – ajd

回答

0

這似乎是使用代理時遇到的問題。通過禁用代理或可能不使用更改跟蹤(現在顯然爲discouraged)可能可以解決這個問題。

正如我對這個問題的意見也有其他人遇到類似問題,可以在這裏找到:

Stack Overflow

Microsoft Connect

相關問題