2012-03-12 8 views
3

私は階層(ブランド)パー表とEentity Frameworkのモデルともタイプ(ビークル)パー表このような継承があります。複数の継承モデル間の関係をどのようにマップする必要がありますか?

enter image description here

を(車両・ブランドは抽象クラスです) 。

これまでのところ、Vehicle.OfType<>またはBrand.OfType<>メソッドを使用して、linqクエリで派生したエンティティにアクセスできます。

ここで、ブランドエンティティは私の概念モデルでVehicleに関連しているので、問題は、EFモデルで関係をどのように作って、VehicleとBrandの間でナビゲーションプロパティを使用することができますかブランドのTPHの継承の一貫性は?私の最初のアプローチは次のように、唯一の派生clasesを関連付けることだった:

enter image description here

しかし、私はこれを行う場合、私が直接車両からブランドへのアクセスを持っていないので、私は希望

のように、二重の関係(派生とベースの間)をしなければなりません。enter image description here

これは私の今のところ働いていますが、何とか複製関係がありますが、これは正しいのですか?あなたはより良いアプローチをしていますか?私のモデリングには間違いがありますか?

+0

悪魔の提唱者の質問モデル - しようとしているものの基本的なポイントのいずれか見逃していないことを願っています:ホンダブランドってどんなの? IMHO、あなたはここで継承を使い過ぎています。 –

+0

私は両方の車(バイクとバイク)を持っているブランドがあると知っていますが、その場合は "ホンダカー"と "ホンダバイク"と区別したいので、それは過剰使用だと思うのはなぜですか? – Milox

+1

オブジェクトは1つのタイプしか持つことができないためです。ホンダにとってはこれが正しいと思っても、どこのブランドでもそうではありません。そのような単一のビジネス属性のフラグとしてタイプを使用すると、スキーマを進化させることが難しいコーナーに戻ることができます。私はこれを連想としてモデル化します。[ブランド:Honda]は[CarBrand:HondaCars](つまり階層の代わりに2つのインスタンス)に関連しています。次に、両方を含むことができるブランドを持っていたい場合は、基数を1:1から1:*に変更できます。 –

答えて

1

あなたが人為的にトップレベルの兄弟エンティティとしてブランドを分離しているので、あなたがあなたのモデルに架橋に実行されている理由があるように私には思えます。 ブランドで始まる場合は、と実質的に同じように見えます。は、真の最上位エンティティになります。 を車種(車、オートバイ、トラックなど)ごとに分ける必要はありません。エンティティを紹介するだけですモデルの間にを作成してくださいと私はあなたのクロスリンクの問題のほとんどを解決すると思います。

これらの関係は厳密に親子ではありませんが、構成としてより正確です。だからを作成します。と1対多の複合関係を持ち、これは車両に1対多の複合関係を持っています。車両はインスタンスモデルであるため、実際にはどちらかに親子関係はありません。この構造では、車両のタイプごとにEFを分岐する必要はありません。これはモデルエンティティによって記述されているものの一部なので、分岐する必要はありません。

私は私の答えは便利ですし、私はあなたが

関連する問題