2012-05-03 7 views
1

私は.NETのデータフレームワークを利用したいと思いますが、どういう仕組みが混乱しているか分かりません。 (私はこれをPHPフレームワークでやっているので、.NETでも同じことができればいいと思っています!)要するに、私はビジネスロジックをデータベースに依存せず、ある意味では、それはまったくデータベースです。このようなIDを忘れることができる.NETデータモデルは何ですか?

クエリは、私を刺激する:

var productNames = 
    from p in context.Products 
    where seller.SellerID == mySeller.SellerID 
    select p.Name; 

その代わり、私がやってみたい:本質的には

var productNames = 
    from p in context.Products 
    where seller == mySeller 
    select p.Name; 

を、私はIDのマッピングについてないケアに私のビジネスロジックをしたいです。部分的には、これは、いくつかのテーブルでIDが本当の意味を持つためです。 (私が扱っているテーブルの中には、別のアプリケーションドメインからインポートされたものがあり、それらのIDを直接扱う必要がありますが、自分のタイプのIDは付随しています)。

この例では、一般的に、私はオブジェクトの世界で完全に働き、基になるデータベースの現実を多かれ少なかれ忘れたいと考えています。これはクラスの等価演算子を定義するだけの問題ですか?

概要:.NETデータフレームワークによって、オブジェクトの世界で最もクリーンなデータベース抽象化がもたらされます。

+3

あなたのドメイン内の別の売り手をidや他の一意の識別子なしで一意に特定する方法は他にありますか? – xandercoded

+0

私は比較のためにIDを使用することを望んでいましたが、その関係を他の場所に定義することでビジネスロジックには見えません。 –

答えて

5

商品と売り手の関係がある場合(私はコード例に売り手が何もわからない)、EFはp.Seller(または商品ごとに複数の売り手がある場合はp.Sellers)をします。

しかし、それはあなたがしたいことを助けるようには思われません。 seller == mySellerは完全ではありません。平等を決定するのは何ですか?通常、平等を確立するための主キーがあります。 IDを比較することはまだ理にかなっています。また、一般的にははるかに効率的です。

もう1つの方法は、==演算子をオーバーロードすることです。これにより、オペレータのユーザには見えないIDを比較するメソッドを記述することができます。ただし、これはSQLに変換できないため、照会では機能しない場合があります。

+0

確かに、私はその同値をどこで探すのか、一度に1つの場所ではなく、売り手でその等価を一度定義することはできますか? –

+0

私はちょうど私の答えを更新しました。出来るよ。しかし、データベースはそれについて知りません。クエリがSQLに変換されている場合、それは機能しません。 –

+0

私は参照してください。それはあまりにも悪いです。 (私は、クエリは単にすべての商品を引っ張って、ローカルで売り手のオブジェクトを比較すると仮定しています) –

3

プロパティを使用せずに単にオブジェクトを比較しようとしている場合は、クラス内でEqualsを上書きできます。しかし、これは起こっていることの論理を隠すため、悪い考えです。私はそれに強くお勧めします

+0

同じIDを持つデータベースオブジェクトを等しいと定義することが悪い習慣である理由を詳しく説明できますか? –

+1

私が 'seller.Name =" John "'のようなことをすれば、私は売り手をします。等しい(mySeller) 'の場合、それらは同じIDを持つので、オブジェクトが同一ではなくても「真」を返すでしょう。これはちょうど1つの例 – Icemanind

+1

+1です。演算子==はほとんどの人が期待している特定の動作をしており、IDを比較するだけで(特に変更可能なオブジェクトの場合)、icemanindが指摘するように予想される動作に反します。私。誰もデータベース内の項目が更新されない理由を把握することはできません(すべてのコピーはIDだけで常時一致していますか?そうでないか?クラスが不変の場合、IDがオブジェクトそのものと同じであることを保証すればOKかもしれないことに注意してください。 –

関連する問題