I have a EF 4
POCO DbContext and am showing a table in a DataGrid
(System.Windows.Controls.DataGrid)
.
- I can
SaveChanges
to store changes made in theDataGrid
. - I can
Reload()
to get data updated by another user (ie me usingSQL Management Studio
). - I can then see the other user's data
However, if I try to do 1 then 2 (i.e. make a change in the grid, SaveChanges
, after that another user changes the data then I Reload) I get an InvalidOperationException
.
This happens only when changing the text through the grid, not when changing the data through code.
I can quietly swallow the exception and then see the updated data. However I'd rather not do that without understanding what's going on...
What's going on?
The complete exception is...
System.InvalidOperationException occurred HResult=-2146233079 Message=EntityMemberChanged or EntityComplexMemberChanged was called without first calling EntityMemberChanging or EntityComplexMemberChanging on the same change tracker with the same property name. For information about properly reporting changes, see the Entity Framework documentation. Source=System.Data.Entity StackTrace: at System.Data.Objects.EntityEntry.EntityMemberChanged(String entityMemberName, Object complexObject, String complexObjectMemberName) at System.Data.Objects.EntityEntry.EntityMemberChanged(String entityMemberName) at System.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.Internal.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 , Shaper ) at System.Data.Common.Internal.Materialization.Coordinator1.ReadNextElement(Shaper shaper) at System.Data.Common.Internal.Materialization.Shaper
1.SimpleEnumerator.MoveNext() at System.Data.Objects.ObjectContext.BatchRefreshEntitiesByKey(RefreshMode refreshMode, Dictionary2 trackedEntities, EntitySet targetSet, List
1 targetKeys, Int32 startFrom) at System.Data.Objects.ObjectContext.RefreshEntities(RefreshMode refreshMode, IEnumerable collection) at System.Data.Objects.ObjectContext.Refresh(RefreshMode refreshMode, Object entity) at System.Data.Entity.Internal.InternalEntityEntry.Reload() at System.Data.Entity.Infrastructure.DbEntityEntry.Reload() at Chilli.Model.ObjectContext.SafeReload(Object o) in c:\projects\MyProject\Chilli.Model\ObjectContext_Refresh.cs:line 19 InnerException: