Entity Framework (3.5) - Отклонить изменения

У меня есть эта услуга, которая является Singleton и Single threaded и обслуживает множество клиентов с низким объемом. Он использует Entity Framework и данные в SQL Server.

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

Есть ли способ отменить изменения в EF-данных, если сбой не удается?

Спасибо в Advance

Ответ 1

Ответ на вопрос: "Вы не можете отменить изменения в контексте", вместо этого нужно отказаться от ObjectContext, как объяснил Марк.

Ответ 2

Entity-models/data-contexts/etc лучше всего обрабатывать как единицы работы. Если вам нужно отменить его, просто отбросьте контекст и начните с нового. И если вам это удастся, отбросьте его в любом случае! Каждый запрос должен действительно использовать отдельные контексты данных, иначе вы можете получить ряд проблем:

  • Threading (хотя кажется, что вы избегаете этого, делая его однопоточным)
  • рост данных (есть менеджер идентичности, каждая строка, с которой вы касаетесь, остается, много раз)
  • общая изоляция и т.д.
  • управление жизненным циклом соединения (блокирование открытого соединения)
  • и т.д.

Ответ 3

Примечание. Вы можете обновить до 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

Голова вверх! В новой предстоящей версии эта функция стала намного проще.

Ответ 4

Вы можете обновить объект, вызвав

context.Refresh(RefreshMode.StoreWins, entity)

поэтому я не вижу необходимости в RejectChanges.