2011-02-07 14 views
3

データベーススキーマを正規化してEntity Frameworkでマッピングしようとすると、ルックアップテーブルの束になってしまうことがあります。彼らはキーと値のペアだけを含むことになります。私は基本的に "キー"と "値"の2つの列を持つ1つのテーブルにそれらを統合したいと思います。たとえば、Addresses.AddressTypeとPerson.Genderを両方とも同じテーブルを指すようにすることができますが、ナビゲーションプロパティは適切なエンティティに適用可能な行のみを返すようにしたいと考えています。EF階層ごとのマッピング

EDIT:私はこの段落を残したことに気づきました:

これはTPHの問題のようですが、私が行った読んだことはすべて、親エンティティのフィールドから始まり、継承された子にフィールドを移行することを示しています。私はここに移動する欄はありません。なぜなら、一般的には2つしかないからです。

多くのドメイン固有のキーと値のペアが必要です。それらのうちのいくつかは時折変更されますが、他の人は変更されません。選んで選択するのではなく、すべてを編集可能にしたいだけです。これらの種類のプロパティが使用されるため、リコンパイルが必要な列挙型を維持する必要はなく、多くのルックアップテーブルが必要になります。だから、これは解決策かもしれないと思った。

EF4でこの種の構造を表現する方法はありますか?それとも、私は間違った木を鳴らしていますか?

EDIT:データベースレベルで必要なテーブル構造を構築し、その上にビューを作成し、それらをEFエンティティとして記述することもできます。メンテナンスを複数のレベルで行う必要があることを意味します。それは純粋なEFソリューションよりも多く、あるいはそれほど望ましくない音ですか?

+0

まず、オブジェクト側から考えてみてください。あなたはここでリレーショナルに話しています。 AddressTypeとGenderの間の家族関係は、あなたのモデルをどの程度意識しますか? –

+0

私は実際には、これらの2つのプロパティの間に何らかの概念的関係を作成しようとしていません。私が見ているすべてのプロパティは、基本的なスキーマが「key」と「value」の下にあります。私は、複数のプロパティを同じ基礎となるテーブル構造にマップできるようにしたいだけです。オブジェクトのオブジェクト側からは関係はありません。 – kettch

答えて

2

テーブルごとに、子エンティティの基本クラスとして使用される1つの親エンティティが必要です。すべてのエンティティは同じテーブルにマップされ、データベースレコードに格納されているエンティティのタイプを異ならせるための特別な識別子があります。子エンティティが新しいプロパティを定義していなくても、通常はそれを使用できます。テーブルのプライマリキーを定義する必要があります。それ以外の場合は、EFの読み取り専用エンティティとして処理されます。あなたはプロパティID、キー、値およびタイムスタンプ(固定並行処理モードとして設定)を使用して、トップレベルKeyValuePairのエンティティを定義します

CREATE TABLE KeyValuePairs 
(
    Id INT NOT NULL IDENTITY(1,1), 
    Key VARCHAR(50) NOT NULL, 
    Value NVARCHAR(255) NOT NULL, 
    Discriminator VARCHAR(10) NOT NULL, 
    Timestamp Timestamp NOT NULL 
) 

:だからあなたのテーブルは次のように見ることができます。 Discriminator列は継承マッピングに使用されます。

EFマッピングが静的であることに注意してください。 AddressTypeとGenderエンティティを定義すると、それらを使用できるようになりますが、PhoneTypeのような新しいタイプを動的に定義することはできません。これにより、EFモデルの変更、アプリケーションの再コンパイルと再デプロイが常に必要になります。

OOPの観点からは、これをオブジェクトの検索としてモデル化しないで、複数の無関係なエンティティを同じテーブルに条件付きでマッピングする方が良いでしょう。 UnfortunatellyでもEFは条件付きマッピングをサポートしています私はまだ2つのエンティティを同じテーブルにマップすることはできませんでした。

+0

子エンティティに条件を追加しようとすると、ID以外の列が表示されないことがあります。 – kettch

+0

@kettch:条件の意味は? –

+0

これは、あなたが働くことができないと言っていたことでしょう。継承されたテーブルを追加した後、条件付きマッピングを追加して、ドロップダウンには親のPK以外はありません。 – kettch

関連する問題