2012-04-23 3 views
2

私は、クライアントの著者の2つのクラスを持っています。これらはどちらもメンバーから派生しています。彼らはメンバに何も追加しませんが、私はセマンティクスと後で拡張が可能なために別のクラスを持つことを好みます。私は著者AuthorRoleメンバーシップを持っている、とクライアントClientRoleメンバーシップを持っているメンバーあるメンバーでの役割に基づいて差別化。ディスクリミネータカラムでのプレーンバニラTPHマッピングを使用すると、メンバーは、クライアント作成者の両方でなくなります。ディスクリミネータ列を使用せずに、2つのクラスを同じテーブルにマップするにはどうすればよいですか?

私は、これは任意の継承の私のデシベルコンテキストが穏やかに気づいていないとClientRepositoryAuthorRepositoryは、マッピングを行うことです解決するために見ることができる唯一の方法が、ここで私があるため、例えば、パフォーマンスヒットを取りますClientRepositoryはMemberインスタンスを照会し、これらをClientインスタンスにマップする必要があります。

これを行うには別の方法がありますか?

答えて

0

EFでのTPHマッピングでは、クライアントはメンバーであり、作成者はメンバーですが、クライアントと作成者のメンバーは決して存在しないことがあります。役割をクライアントから著者に、またはその逆に変更するメンバーは存在しません。

2つの派生クラスを同じテーブルに格納する場合は、TPHとディスクリミネータを使用する必要があります。 EFは、上記の規則が確実に守られるようにします。これらのルールのいずれかがあなたのシナリオでは有効でない場合継承はあなたのためにとにかく悪いデザインです。.NETでもインスタンスのタイプをクライアントからメンバーに変更することができないからです。

現在のデザインを維持したい場合は、EFがリレーションを通じてTPH継承を実行できないため、クライアントリポジトリとカスタムクラスへの追加マッピングレベルを使用する必要があります。関係を変更することができますが、すでに作成されたインスタンスのタイプを変更することはできないため、そのような継承は存在しません。

+0

私は「メンバーがクライアントと著者の両方を排除する」と言っていますが、あなたはいいえ、私は間違っていますが、「クライアントと著者であるメンバーは決して存在しません」と言いました。それはまさに私が言ったことです、どうすれば間違っているのですか? マッピングを行っていますが、EFがこれを処理できないと言いますが、その部分を確認していただきありがとうございます。 – ProfK

+0

申し訳ありません、それは私の英語の問題でした - 私はあなたの記述を正しく理解していませんでした。私は答えを修正しました。 –

+0

問題ありません、ありがとうございます。 – ProfK

関連する問題