2009-04-08 5 views
4

현재 삭제 된 항목이 많은 엔티티 모델이 있으므로 상태가 삭제됩니다. '삭제 취소'할 수있는 방법이 있습니까? 어떤 항목을 삭제 취소할지 알고 있지만 항목을 삭제 취소하는 방법을 모르겠습니다. 이상적으로는 변경되지 않은 상태로 되돌려 놓고 싶습니다.엔티티 상태 변경

답변

2

연결 컨텍스트를 커밋하지 않을 수 있습니까? - objectContext.SaveChanges()를 호출하지 않고 ObjectContext를 처리하십시오. 물론, 당신이 구원을 얻지 못하는 어떤 변화가 있다면, 그것들도 존속하지 않을 것입니다.

objectContext.DeleteObject(x)으로 전화를 걸었 으면 삭제를 취소하고 변경 사항을 저장할 수 없습니다.

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

// objectStateEntry.State is not setable 

ObjectStateEntry는 이론적으로 고심의 ObjectContext를 종료, 원래의 변경, 마이너스 원치 않는 사람을 대표하는 컬렉션을 다시 새를 열고 이러한 변경을 뺀 원치 않는를 재 구축 할 수 있도록 OriginalValues ​​속성을 가지고있다 거기에있는 것들. 아마도 번거롭게 할만한 가치는 없겠지만, 현재로서는 삭제할 항목을 해제 할 수있는 문서화 된 방법이 없습니다.

+0

너무 나쁩니다. 나는 아무 방법도 없다는 느낌이 들었다. 불행하게도 우리는 컨텍스트를 제거 할 수 없으므로 실제로 옵션이 아닙니다. 지금은 제거되기 전에 수정되어야하는 객체 목록을 구현했습니다. 실제로 실제로는 큰 번거 로움과 변화가없는 것으로 표시 할 수없는 것은 너무 나쁩니다. – JohnathanKong

+0

Entity Framework 디자인 블로그 http://blogs.msdn.com/efdesign/ : "... VisualStudio 2010 및 .NET Framework 4.0의 측면에서 제공되는 자체 추적 엔터티 아키텍처." "... 필요할 경우 (Delete() 및 SetUnchanged())이 상태를 변경하려면 각 자체 추적 엔터티에 conveience 메서드가 있습니다." EF2에서이 기능을 사용할 수있는 것 같습니다. – Tion

8

당신이 전화 후

objectContext.DeleteObject (x)의,

당신은 X

objectContext.Detach와 객체 의 삭제 취소를 시뮬레이션 할 수 있습니다 (X); objectContext.Attach (x)

0

Context, ObjectSet 또는 EntityObject에 대해 RejectChanges 메서드를 구현할 수 있습니다. 지금은 VB 코드는 이러한 방법의 총수 : 확장 방법을 상황에 RejectChanges을 위해 : EntityObject에 대한 RejectChanges를

<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  

을 마지막으로 구현 : ObjectSet에서 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 

확장 mehod

<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  

바이. [Iman Shabanzade]