2011-01-20 6 views
2

のセルに基づいてPOCOオブジェクトをサブクラスにマッピングするエンティティフレームワークを使用しました。私は、行動だけが異なるいくつかのオブジェクトを持っています。 DBに関連するデータの行は同じです。このビヘイビアを含むクラスを定義する行がデータベースにあります。IエンティティFrameworkとC#POCOオブジェクトを使用していたデータベースの行

私は本当に一般的な動作を実装する抽象クラスを使用して、データベース内のその行のベースとEntity Frameworkのからサブクラスのインスタンスを作成したいと思います。この例は、私が取り組んでいるものではありませんが、それは類似していると思います。これが単なる類推であり、私は文書管理について何も知らないので、これは文書を扱うには間違った方法です。

たとえば、「文書」表のこれらの2つの行行):理想的

DocumentId Description   DocumentType 
314  A word processing document WordProcessingDocument 
315  A spreadsheet   SpreadsheetDocument 

、Iは抽象ドキュメントクラスに記載の一般的な挙動を有するであろう1 Document.WordProcessingDocument一Document.SpreadsheetDocument、で終わることになります。 Entity Frameworkはこれらのオブジェクトと他のオブジェクトとの関係を引き続き管理しています。

これはできますか?または、Entity Frameworkはテーブルごとに1つのクラスのみをインスタンス化できますか?これらのテーブルにはデータが存在しないため、各サブタイプに対して新しいテーブルを作成するのは意味がありません。これらのサブクラスは、データではなく動作のみが異なります。 1関係:

+0

FYI - 今私は、戦略デザインパターンを使用してエンティティフレームワークに動的にサブ分類オブジェクトを作成することができないの周りに働いています:私は、Entity Frameworkの負荷Documentオブジェクトのようなものを持っており、各ドキュメントには、コンポーネント(例えばを持っています、WordProcessingComponent、SpreadsheetComponent)を使用して、IDocumentComponentインターフェイスを実装し、それ以外の場合はサブクラスに入るユニークな動作を定義します。次に、コンポーネントメソッドを呼び出すたびに、関連するすべての状態を持つHas​​hTableをDocumentオブジェクトからそのコンポーネントに渡します。 –

+0

ありがとう!私は、新しいサブクラス/コンポーネントを作成するユーザーがEDMXファイル内のクラスをマップする必要がないように(コンポーネントマッピングw/Reflectionを処理できるように)、コンポーネントテクニックに固執することになりました。私は新しいコンポーネントタイプを追加するために、複数のプロジェクトにまたがって多くの異なる開発者が参加することを期待しています。新しいコンポーネントが追加されるたびにEFコードを更新する必要はありません。これまでの両方の答えは素晴らしいですが、私はLadislav'sに「階層ごとの表」という用語を含めて受け入れています。そのため、より多くの情報を探すときに何を探すべきか、そして「ハウツー」のリンクを知っていました。 –

答えて

3

これはTable per Hiearchy(またはTPH)と呼ばれ、それは、EFで可能です。基本クラスをエンティティとしてモデル化し、具体的なクラスを基本クラスから派生したエンティティとしてモデル化する必要があります。 Discriminatorという特別な列(おそらくDocumentType)が必要ですが、これはデータとしてはマッピングされませんが、DBから行をロードするときにどのサブクラスを実現するかを定義します。

3

はい、これが1ではなく、ディスクリミネータ・カラムを使用し、標準的なテーブル継承パターンです。現在のテーブルタイプを継承する2つの新しいタイプをEDMXで作成し、マッピングエディタを使用して、インスタンス化するサブクラスと各サブクラスに対応する値を定義するカラム(DocumentType)を指定します。列を追加する必要はありませんが、部分クラスを使用して、個々のタイプごとにカスタムビジネスロジックまたはビヘイビアを定義することができます。

また、これは、EFが自動的に挿入時に行にこれらの値を割り当てるの世話をすることを意味します。つまり、SpreadsheetDocumentまたはWordProcessingDocumentをインスタンス化し、AddObjectに電話するだけです。このルートを使用すると、コードから完全にDocumentType列が隠れることになります。

関連する問題