Entity Framework (3.5) - отклонить изменения - PullRequest
11 голосов
/ 18 августа 2010

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

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

Есть ли способ отменить изменения данных EF при сбое сохранения?

Заранее спасибо

Ответы [ 4 ]

11 голосов
/ 18 августа 2010

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

  • многопоточность (хотя звучит так, что вы избежали этого, сделав его однопоточным)
  • рост данных (есть менеджер удостоверений; каждая строка, к которой вы прикасаетесь , остается вокруг; фактически несколько раз)
  • общая изоляция и т. Д.
  • управление временем жизни соединения (переключение)открытое соединение)
  • и т. д.
8 голосов
/ 02 января 2011

Примечание: вы можете перейти на EF 4.1 или 4.2, что облегчает эту работу:

context.Entry(myEntity).State = EntityState.Unchanged;

Подробнее см. .

Создайте частичный класс для вашего ObjectContext сгенерированного класса и включите в него следующие методы (VB, извините - их следует легко переписать в C #):

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's not supposed to stop here.")
    End Select
  Next
End Sub

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

4 голосов
/ 24 августа 2010

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

3 голосов
/ 09 декабря 2010

Вы можете обновить сущность, позвонив

context.Refresh(RefreshMode.StoreWins, entity)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...