EF 4 Pocoがすでにオブジェクトセットにいるかどうかを効率的に判断します
-
24-10-2019 - |
質問
私は初めて小さなプロジェクトでPocoのEF 4を試しています。リポジトリの実装では、新しい場合はリポジトリにPassed-in 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が呼び出されたときに、リポジトリが新しいまたは既存のオブジェクトのいずれかのPoCOを更新するためのクリーンで効率的な方法は何ですか?
私はオブジェクト自体にisnewフラグを携帯することを検討しましたが、私は実用的な限り永続性の無知を取り入れようとしています。
解決
見てみてください ObjectStateManager.TryGetObjectStateEntryメソッド, 、それは良い説明です このStackOverFlow Queston.