2009-04-08 24 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 Designブログhttp://blogs.msdn.com/efdesign/は "VisualStudio 2010と.NET Framework 4.0の側面に沿って出荷されるセルフトラッキングエンティティアーキテクチャ"と言っています。 "... 必要に応じてこの状態を変更するために、各セルフトラッキングエンティティにコンビニエンスメソッドがあります(Delete()およびSetUnchanged())。) この機能はEF2で利用できるようです – Tion

8

あなたは

objectContext.Detach(x)を持つオブジェクトXの削除取り消しをシミュレートすることができますobjectContext.DeleteObject(x)の

を呼び出した後、 objectContext.Attach(x)

0

Context、ObjectSetまたはEntityObjectに対してRejectChangesメソッドを実装できます。 今私は、これらの方法の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 

objectSetとでRejectChangesを実装するための拡張mehod:

<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  

、最終的にはEntityObjectのためのRejectChanges実装:

<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  

bye。 [Iman Shabanzade]

関連する問題