4

私は初めて小さなプロジェクトで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フラグを付けることを検討しましたが、実用的な範囲で永続性を無視しようとしています。

4

1 に答える 1

2

ObjectStateManager.TryGetObjectStateEntryメソッドを見てみてください。これはこのstackoverflowクエストでよく説明されています。

于 2010-06-06T21:12:05.830 に答える