2009-05-26 8 views
3

Visual Studio(sqlmetal)によって生成されたdbmlファイルには、エンティティがデータベーステーブルにマップされています。あなたの意見では、これらのクラスはドメインモデルクラスとして使用するのに適していますか?あるいは、それらを避けて、それらをデータアクセス層にのみ分離する必要がありますか?LINQビジネスオブジェクトとしてのエンティティ

おかげ

+0

あなた自身の質問に答えただけではありませんか?あなたはデータベースをドメインモデルに設計していませんでしたが(希望しています)、これらの「エンティティ」はデータベーステーブルに直接マッピングされるため、ドメインモデルではないものに直接マッピングされます。私はそれが「いいえ」と答える理由だと考えます。 –

+0

John Saunders、Entity Frameworkモデルは、LINQ to SQLとは異なり、DBスキーマに直接マップする必要はありません(実際にはそうしないでください)。 –

答えて

1

それはあなたのドメインオブジェクトは小さな非常にシンプルで、あなたのプロジェクトですしている場合は、これらのクラスを使用することは問題ではありません

を依存します。これらのクラスを繰り返すだけの余分なレイヤーを書くのは時間の無駄でしょう。

オブジェクトが複雑でであり、厳密にマッピングされていない場合、これらの詳細をデータアクセスレイヤーから分離するために、別のレイヤーが不可欠です。

本当にわからない場合は、直接使用してから、必要があることが明らかになったら別のレイヤーを追加してください。

3

単純なアプリケーションの場合、LINQエンティティを直接使用する大きな利点は - シンプルさです。コード内にもう1つのレイヤーが存在するのを避けることができますが、ビジネスオブジェクトからLINQエンティティにマップするための多くの定型ロジックを書く必要はありません(AutoMapperのようなツールがありますが)。

あなたの言うとおり、あなたのデータベースはおそらくあなたのドメインモデルのスピッティングイメージではありません。さらに、特定の物理データベースモデルと論理ドメインモデルをマッピングするためにこの機能が必要な場合は、代わりにEntity Frameworkを参照する必要がありますか?これはまさにEFの主流です。これら2つのモデルとそれらの間のマッピング層です。

マルク・

+1

+1エンティティフレームワークを使用するための提案です。それはあなたの路地の上にあるかもしれないように聞こえる。 – Jagd

4

ほとんどのケースでは、エンティティオブジェクト間およびSQL を書く甘い良さの層があなたのDALです。 LINQの目的は、過去に可能だったよりもはるかに表現力豊かな構造をDALで可能にすることです。

LINQなしでは、DALに対してGetCustomersByLastName(string)などのメソッド呼び出しに制限されることがあります。その方法を書いた唯一の理由は、あなたのBLのどこかで、あなたは姓で顧客を取得する必要があるからです。つまり、DAL契約はBLのニーズによって明示的に推進されます。 LINQでは、BLのニーズとDALの契約の間の具体的な依存関係から解放されます。 DALは、特定の用途に関して完全に不可知論的であり得る。単にエンティティとその関係の契約を公開するだけであり、BLはデータの実装を心配することなく自由にそれらを使用します。つまり、懸念の分離です。

伝統的なDALの背後にあるLINQの能力を隠すと、LINQを使用するポイントは何ですか?

+1

私はまったく同意します。私は、LinqがSQLを見たのと同じ方法で見る多くのプログラマに遭遇しました。 DAL自体として扱うのではなく、 "DAL"で包むべきだと彼らは思っています!私はLinq **があなたのBLとSQLの間の層であるというメッセージを人々が得始めることを願っています。 –

0

シナリオによって異なると思います。私は今、WCFサービスを書いています

は、私のデータモデルは非常に複雑ではなく、すべてのテーブルには、LINQはかなり複雑なオブジェクトツリーを作成します外部キーとテーブル間の関係を持っています。

クライアントの観点からは、このオブジェクトツリーをすべて取得するのは意味がありません。また、戻り値のxmlメッセージも非常に重いです(メッセージサイズの最大値を変更しないとエラーが発生します)。

この場合、クライアントが取得する予定のデータだけを返すようにLINQオブジェクトのカスタムビューを作成する必要がありました。ほとんどのエンティティを書き直さなければならないので、これはかなり苦痛ですが、結局クライアントとの通信を完全に制御しています。

関連する問題