2011-07-01 5 views
8

異なる場所から「論理的に」(データベース内の)同じオブジェクトをクエリすると、エンティティフレームワークは同じオブジェクト参照を返しますか?例えば同じデータベースオブジェクトに対してエンティティフレームワークオブジェクト参照が等しいかどうか

は、私は、名前ジョー・ブラックを顧客に照会(と私は、データベースに一つだけジョー・ブラックをがあることを知っている今の前提としています。)5がどこにあるか Customer c = select ... blabla where ... Name == Joe Black...;とコード内のどこかに、私はCustomer c2 = select... where.. ID==5を照会しましたジョー・ブラックのID。データベースでは同じオブジェクトにマップされていますが、コードレベルで同じオブジェクトにマップされていますか?それでc1はc2に等しいですか?私はリストをマージし、オブジェクトの論理的な平等をチェックしています(私は現在データベースにアクセスできない)、Entity Frameworkオブジェクトがうまく動作するかどうか、またはカスタム比較クラスを書くべきかどうか疑問に思っていました。

答えて

13

Entity FrameworkおよびNHibernateを含むほとんどのORMは、Identity Map Patternを使用して、プライマリキーごとに特定のエンティティのインスタンスが1つだけ存在するようにします。アイデンティティマップはコンテキストによってスコープされるため、2つの異なるコンテキストが同じエンティティを参照する2つのオブジェクトを作成します。エンティティにEquality演算子のオーバーライドを含むIEquatableを実装させると、 '=='または '!='が機能するようにすることをお勧めします。これは、考えられるよりも複雑です。たとえば、hereを見てください。

+0

質問でお答えしました、ありがとうございます。つまり、私の仕事は簡単ですが、Entity Frameworkの自動生成クラスの実装方法やオーバーロード演算子を追加する方法はわかりません。とにかく、私のDBに再びアクセスして、それは働いた。だからEFもそれを処理します。 –

関連する問題