私は初めて小さなプロジェクトでPOCOを使ってEF4を試しています。私のリポジトリ実装では、渡されたPOCOが新しい場合はリポジトリに追加するメソッドAddOrUpdateを提供したいと思います。それ以外の場合は、何もしません(SaveChangesが呼び出されたときに更新されたPOCOが保存されるため)。
私の最初の考えはこれを行うことでした:
public void AddOrUpdate(Poco p)
{
if (!Ctx.Pocos.Contains<Poco>(p))
{
Ctx.Pocos.AddObject(p);
}
}
ただし、その結果、 「サポートされていない非スカラー変数の参照NotSupportedException
」で説明されているようになります(ボーナス質問:なぜサポートされないのですか?)
パーツを削除しContains
、常にAddObjectを呼び出すだけで、次のようになりますInvalidStateException
。
同じキーを持つオブジェクトは、ObjectStateManagerにすでに存在します。既存のオブジェクトは変更されていない状態です。オブジェクトは、追加された状態にある場合にのみ、ObjectStateManagerに再度追加できます。
したがって、EF 4は、これがキーに基づく重複であることをどこかで明確に認識しています。
AddOrUpdateが呼び出されたときに、リポジトリが新しいオブジェクトまたは既存のオブジェクトのPocosを更新して、後続のSaveChanges()の呼び出しが正しく行われるようにするための、クリーンで効率的な方法は何ですか?
オブジェクト自体にisNewフラグを付けることを検討しましたが、実用的な範囲で永続性を無視しようとしています。