2011-10-10 12 views
6

エンティティフレームワークエンティティに関連するデザインに関する質問があります。エンティティフレームワークデザイン - データの複数の "ビュー"

私は、次のエンティティを作成しました:

public class SomeEntity { 
    // full review details here 
} 

このエンティティは、例として、30列があります。私は新しいエンティティを作成する必要があるとき、これは素晴らしい作品です。私は、データベースに挿入するために必要なすべてのフィールドを持っています。

SomeEntityのいくつかのフィールドでいくつかの表形式のデータを表示する必要があるアプリケーションがいくつかありますが、30列、多分2列または3列しか必要ではありません。

私は私が必要なフィールドのみ持つまったく新しいエンティティ作成してください(SomeEntityと同じテーブルにマップが、唯一私が欲しい列を取得?)

それとも作成するために多くの意味を成していません(PartialEntityのような)ドメインクラスと、このようなクエリ書く:私は適切な方法は事のこのタイプを何をすべきかわからない

var partialObjects = from e in db.SomeEntities 
        select new PartialEntity { Column1 = e.Column1, Column2 = e.Column2 }; 

を。同じテーブル/カラムにマッピングする2つのエンティティを持つことは悪い考えですか? PartialEntityを作成してデータベースに保存する必要はありません。なぜなら、必要なフィールドがすべてないからです。

答えて

2

あなたの最初の方法はありません。 EFは、同じテーブルにマップされた複数のエンティティをサポートしていません(ただし、TPH継承やテーブル分割などの特殊な場合を除く)。

2番目のケースは一般的なシナリオです。 UIのビューモデルを作成し、エンティティをプロジェクトで照会して直接モデルを表示する(プロジェクトで使用するDBのみの列から継承します)か、エンティティ全体を照会し、アプリケーションコード内のモデルをビューに変換しますAutoMapper @Fernandoが述べたように)。

マッピングのためにEDMXファイルを使用している場合(上記の理由でと記述されていないと思います)、前述の両方のアプローチから取り入れる3番目のアプローチを使用できます。このアプローチでは、QueryViewが定義されています。新しい読み取り専用エンティティとして動作するマッピングされたエンティティのEFベースのビューです。一般的にマッピングで直接格納された再利用可能な投影です。

+0

私の2番目のアプローチはどうですか?それはちょうどPOCOを作成し、私の実際のエンティティを照会してそのオブジェクトを返すクエリを書くだけですか? – Dismissile

1

オブジェクトインスタンスを取り込み、列名の文字列配列を渡す汎用プロパティフィルタメソッドを作成できます。このメソッドは、必要な列のみを持つ動的オブジェクトを返します。

1

同じデータ構造に基づいて2番目のエンティティを追加するには、モデルに不要な複雑さが加わると思います。私は正直なところ、\ editing \ viewingを更新するための単一のエンティティを持つという問題を見ていません。 SomeEntityへのアクセスを分離することを主張する場合は、データベースビュー、つまりSomeEntityViewを使用し、に基づいて別のエンティティを作成すると、となります。

2

最初の解決策として提案したのは、データを取得してモデルクラスにマップするビューのモデルであるという唯一の目的でクラスを作成する「モデルパラダイムの表示」です。 AutoMapperを使用して値をマップできます。これを適用する方法はarticleです。

+0

現在、ビューモデルの作成にAutoMapperを使用しています。このシナリオは、エンティティ全体を選択することの非効率性を望まないため、わずかに異なります。このクエリで1000行を取得した場合:var data = from a db。MainEntityはaを選択します。私の小さな型にマッピングを適用した、私はかなりスマートなクエリを作成しないだろうと確信しています。だからこそ私は小さなエンティティを作成するか、 "マッピング"を自分で行うためのクエリを書くべきかどうかを尋ねていたのです。 – Dismissile

関連する問題