2011-01-03 6 views
1

私のPOCOの変更をデータベースに保存するのに問題があります。POCOの変更を保存する

私はPOCOオブジェクトに必要なすべてのオブジェクトを取得し、「保存」ボタンをクリックすると新しいObjectContextインスタンスを作成し、オブジェクトをループしてコンテキストにアタッチする必要があります変更を検出して保存します。

public void SaveData() { 
     using (SolEntities sec = new SolEntities(_cxnStr)) { 
      foreach (ExtViews.Planet p in Planets) { 
       sec.CelestialBodies.Attach(p.TheBody); 
       sec.CelestialBodies.ApplyCurrentValues(p.TheBody); 
      } 
      sec.SaveChanges(SaveOptions.AcceptAllChangesAfterSave | SaveOptions.DetectChangesBeforeSave); 
     } 
    } 

しかし、これは動作するようには思えない、私は仕事にそれを得ることができる2つの方法のどちらかにした: A)は、から生成することを強制する(foreachループの前に惑星のローカルリストを作成します。変更された値を適用する前にDbと仮定して)、Attachサテライトを削除します。

sec.ObjectStateManager.ChangeObjectState(p.TheBody, System.Data.EntityState.Modified); 

しかし、手動ですべてのオブジェクトのために変更にObjectStateを強制することは、それらが変更されていませんでした場合は特に、私は内部の何かを保つことができ、ビットやり過ぎのようだ: または B)は、このいずれかのApplyCurrentValuesラインスイッチそれが変更されているかどうかは問わず、私はApplyCurrentValuesが最初にそうするだろうと考えましたか?

+0

ここで私の答えを確認してください:http://stackoverflow.com/questions/3635071/update-relationships-when-saving-changes-of-ef4-poco-objects/3635326#3635326各オブジェクト - 切断されたオブジェクトを使用する場合は、手動で同期を行う必要があります。 –

答えて

3

Pocoオブジェクトは変更を追跡できません。エンティティから派生したオブジェクトだけが変更を追跡できます。そうしないと、自己追跡オブジェクトを生成するか、変更を追跡するカスタムクラスからpocoオブジェクトを派生させる必要があります。

あなた自身のオブジェクトのプロパティ変更イベントをフックするか、変更をローカルリポジトリに保存するようなコードを生成して、送信が成功した場合は空にできます。

関連する問題