Изменить состояние объекта - PullRequest
4 голосов
/ 08 апреля 2009

В настоящее время у меня есть модель сущности с кучей удаленных элементов, состояние удалено. Есть ли способ «восстановить» их? Я знаю, какие элементы я хочу восстановить, но я не знаю, как их удалить. В идеале я хотел бы вернуть его в неизменное состояние.

Ответы [ 3 ]

8 голосов
/ 10 января 2010

после звонка

objectContext.DeleteObject (x) ,

вы можете смоделировать восстановление объекта x с помощью

objectContext.Detach (х); objectContext.Attach (х)

2 голосов
/ 06 мая 2009

У вас есть возможность просто не фиксировать контекст соединения? - избавьтесь от ObjectContext без вызова objectContext.SaveChanges (); Конечно, если у вас есть определенные изменения, которые вы не хотите сохранить, они также не сохранятся.

Если вы позвонили objectContext.DeleteObject(x), вы не можете отменить его и сохранить изменения.

ObjectStateEntry objectStateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(x);

// objectStateEntry.State is not setable 

ObjectStateEntry имеет свойство OriginalValues, так что теоретически вы можете кропотливо воссоздать коллекцию, которая представляет исходные изменения, за исключением нежелательных, выйти из objectContext, открыть новое и перестроить эти изменения за вычетом нежелательных. Вероятно, это не стоит хлопот, но в настоящее время не существует документированного способа отменить пометку для удаления.

0 голосов
/ 04 апреля 2014

вы можете реализовать метод RejectChanges для вашего Context, ObjectSet или EntityObject. Сейчас я пишу код VB этих методов: Метод расширения для RejectChanges в контексте:

<Extension()>
Sub RejectChanges(ByVal Context As ObjectContext)
    Dim Collectin As IEnumerable(Of Object) = From e In Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified Or System.Data.EntityState.Deleted) Select e.Entity
    Context.Refresh(RefreshMode.StoreWins, Collectin)

    Dim AddedCollection As IEnumerable(Of Object) = From e In Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added) Select e.Entity
    For Each addedEntity As Object In AddedCollection
        Context.Detach(addedEntity)
    Next
End Sub

Метод расширения для реализации RejectChanges в ObjectSet:

<Extension()>
Sub RejectChanges(Of T As MyEntity)(ByVal Lst As ObjectSet(Of T))
    Dim collection As IEnumerable(Of T) = From o In Lst.AsEnumerable() Where o.EntityState = EntityState.Modified Or o.EntityState = EntityState.Deleted Select o
    Lst.Context.Refresh(RefreshMode.StoreWins, collection)

    Dim AddedCollection As IEnumerable(Of T) = (From e In Lst.Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added) Select e.Entity).ToList().OfType(Of T)()
    For Each entity As T In AddedCollection
        Lst.Context.Detach(entity)
    Next
End Sub    

и, наконец, реализация RejectChanges для EntityObject:

<Extension()>
Sub RejectChanges(ByVal entity As EntityObject, ByVal Context As ObjectContext)
    If entity.EntityState = EntityState.Modified OrElse entity.EntityState = EntityState.Deleted Then
        Context.Refresh(RefreshMode.StoreWins, entity)
    ElseIf entity.EntityState = EntityState.Added Then
        Context.Detach(entity)
    End If
End Sub     

до свидания. [Иман Шабанзаде]

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