Object state change

Currently, I have an entity model with a bunch of deleted items, the state is being deleted. Is there a way to “restore” them? I know what elements I want to restore, but I do not know how to restore elements. Ideally, I would like to return it to an unchanged state.

+4
source share
3 answers

Do you have the opportunity simply not to specify the context of the connection? - delete ObjectContext without calling objectContext.SaveChanges (); Of course, if you have certain changes that you have not saved, they will not be saved.

If you called objectContext.DeleteObject(x) , you cannot restore it and save the changes.

 ObjectStateEntry objectStateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(x); // objectStateEntry.State is not setable 

ObjectStateEntry has the OriginalValues ​​property, so theoretically you can carefully recreate a collection that represents the original changes, minus the unwanted ones, exit the objectContext, open a new one and rebuild those changes minus the unnecessary ones. Probably not worth the hassle, but there is no documented way to undo something for removal at this time.

+2
source

after calling

objectContext.DeleteObject (x) ,

you can simulate undelete object x with

objectContext.Detach (x); objectContext.Attach (x)

+8
source

You can implement the RejectChanges method for your Context, ObjectSet or EntityObject. Now I am writing the VB code of these methods: Extension method for RejectChanges in context:

 <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 

The mehod extension for implementing RejectChanges in an 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 

and finally, the implementation of RejectChanges for 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 

Goodbye. [Iman Shabanzade]

0
source

All Articles