Ответ 1
Ответ на вопрос: "Вы не можете отменить изменения в контексте", вместо этого нужно отказаться от ObjectContext, как объяснил Марк.
У меня есть эта услуга, которая является Singleton и Single threaded и обслуживает множество клиентов с низким объемом. Он использует Entity Framework и данные в SQL Server.
Если какой-либо запрос клиента на сохранение данных завершается с ошибкой, все последующие запросы терпят неудачу, так как каждый раз, когда он пытается сохранить исходный объект с данными с ошибкой.
Есть ли способ отменить изменения в EF-данных, если сбой не удается?
Спасибо в Advance
Ответ на вопрос: "Вы не можете отменить изменения в контексте", вместо этого нужно отказаться от ObjectContext, как объяснил Марк.
Entity-models/data-contexts/etc лучше всего обрабатывать как единицы работы. Если вам нужно отменить его, просто отбросьте контекст и начните с нового. И если вам это удастся, отбросьте его в любом случае! Каждый запрос должен действительно использовать отдельные контексты данных, иначе вы можете получить ряд проблем:
Примечание. Вы можете обновить до EF 4.1 или 4.2, что облегчает эту работу в качестве прелести:
context.Entry(myEntity).State = EntityState.Unchanged;
Подробнее см. этот.
Создайте частичный класс для вашего сгенерированного класса ObjectContext
и включите в него следующие методы (VB, извините - следует легко переписать на С#):
Public ReadOnly Property DirtyObjects() As IEnumerable(Of ObjectStateEntry)
Get
Return ObjectStateManager.GetObjectStateEntries(
EntityState.Added Or
EntityState.Deleted Or
EntityState.Modified)
End Get
End Property
Public Overloads Sub Refresh()
For Each entry In DirtyObjects
Select Case entry.State
Case EntityState.Modified
Dim original = entry.OriginalValues
For Each prop In entry.GetModifiedProperties()
Dim ordinal = original.GetOrdinal(prop)
entry.CurrentValues.SetValue(ordinal, original(ordinal))
RaisePropertyChanged(entry.Entity, prop)
Next
entry.AcceptChanges()
Case EntityState.Deleted
'I think I would need to call the above again, cuz it might be
'changed values on a Deleted-state entry too.
entry.ChangeState(EntityState.Unchanged)
Case EntityState.Added
entry.ChangeState(EntityState.Detached)
Case Else
'do nothing
Debug.Fail("It not supposed to stop here.")
End Select
Next
End Sub
Голова вверх! В новой предстоящей версии эта функция стала намного проще.
Вы можете обновить объект, вызвав
context.Refresh(RefreshMode.StoreWins, entity)
поэтому я не вижу необходимости в RejectChanges.