2013-03-22 4 views
6

Я пытаюсь отменить некоторые изменения с помощью функции перезагрузки. Я получаю InvalidOperationException. Как я могу предотвратить это?Entity Framework 5 InvalidOperationException on Reload

DbContext.SaveChanges(); 
//Entity is in Unchanged state 
//Make some changes to an entity 
//Change state to modified 
DbContext.Entry(entity).Reload(); 

InvalidOperationException
EntityMemberChanged или EntityComplexMemberChanged был вызван без первого вызова EntityMemberChanging или EntityComplexMemberChanging на тот же изменения трекер с тем же именем свойства. Для информации о надлежащей отчетности об изменениях см. Документацию Entity Framework .

EDIT:
Я включил и отключил ProxyCreationEnabled, LazyLoadingEnabled.
Пробовал различные подходы, а. Все эти попытки вызывают одно и то же исключение.

var objContext = ((IObjectContextAdapter)context).ObjectContext; 
objContext.Refresh(RefreshMode.ClientWins, entry.Entity); 


entry.OriginalValues.SetValues(entry.GetDatabaseValues()); 

Надежда я получить решение. Не хотите удалять полный DbContext, чтобы перезагрузить все данные.

+1

Может кто-нибудь из них поможет? http://stackoverflow.com/questions/5221314/refresh-entity-instance-with-dbcontext или этот http://stackoverflow.com/questions/5799737/entity-framework-4-1-dbset-reload или этот http: //connect.microsoft.com/VisualStudio/feedback/details/694567/entitymemberchanged-or-entitycomplexmemberchanged-was-called-without-first-calling-entitymemberchanging-or-entitycomplexmemberchanging-on-the-same-change-tracker-with- имя того же самого свойства? – LiverpoolsNumber9

+0

Это может не иметь ничего общего с вашей ситуацией, но вам нужно проверить .. Вы выполняете какой-либо тип многопоточности/асинхронного программирования в вашей программе? Как использовать любой PLINQ или 4.5 async/wait? – tostringtheory

+0

@tostringtheory Allready проверил его без каких-либо потоков. Та же проблема. –

ответ

2

Цитирую this MSDN thread/post

«стоит отметить, что ошибка появляется ли вы или нет использовать изменения отслеживания через прокси-класса или вызова entitymemberchanged явно. Кажется, я получаю ошибку, когда я исполняю entitymemberchanging и изменен на aa нить вне того, который создал objectcontext/objectstatemanager, независимо от того, выполняю ли я две функции синхронно или асинхронно, используйте блокировки или явное сглаживание потока. Мне кажется, что это какая-то «настоящая ошибка» с objectstatemanager , а не то, для чего было бы простым обходным путем. Бал в вашем суде, MSFT.

P.S. Слишком долго для комментариев.

+0

ОК спасибо. Я сделал другое обходное решение. –

0

Если код такой, как вы его разместили, где объект загружен из DbContext, а затем перезагружен из того же DbContext, вы не должны явно указывать его как Измененный; внесение изменений в Entity достаточно, чтобы отметить его как измененное. Другими словами:

var o = new SimpleObject { Stuff = "One" }; 
db.SimpleObjects.Add(o); 
db.SaveChanges(); 

o.Stuff = "Two"; // implicitly marks as Modified for you, since it's still Attached 

// Unnecessary 
//db.Entry(o).State = System.Data.EntityState.Modified; 

db.Entry(o).Reload(); // Works for me 
0

Я обнаружил, что перезагрузка не выполняется для прокси-объектов, имеющих свойства навигации.

В работе вокруг, сбросить текущие значения, а затем снова, как это:

var entry = DbContext.Entry(entity); 
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload(); 
0

Я имел подобную ситуацию, с тем же описанием исключения. В моем случае я пытался удалить объект из контекста, и он каким-то образом связан с обработчиком propertychanged, который все еще называется.

Я просто убрал обработчик перед удалением лица из контекста с

MyEntity.PropertyChanged -= MyPropertyChangedHandler; 
context.MySet.Remove(MyEntity); //it works after removing the handler 

Надеется, что это помогает кому-то.

Смежные вопросы