1

このようなものが必要な状況が 2 つあります。私のモデルでは、Messageone または two に関係する がありますPersonsAddressesさらに、メッセージには 2 つの 、つまり fromAddressと toが関連付けられていますAddress

2 つの最初の状況では、1---1..2 の多重度との間の関連付けを指定するか、1---1 との関連付けと 1---0 との関連付けの 2 つの関連Persons付けを指定したいと思います。 1. ただし、多重度を 2 に設定することはできません (または方法がわかりません)。制約を最大 2 に設定して 1--* に設定できる可能性があると想像できます (ただし、その方法はわかりません)。 2 つの関連付けを追加すると、側面を見ると少し奇妙に感じます。これは、両方の関連付けに 1 があり、関連する2 つが必要であることを示しているためです。両方のアソシエーションの側に 0..1 のようなものが必要かもしれませんが、それらに xor 制約があるかどうかはわかりませんが、それが良い習慣なのか、EF で可能なのかさえわかりません。 MessagePerson
MessagePersonMessagesMessage最大2であることを指定したい Person には 2 つの異なるメッセージがあるように見えます Person は 2 つまたはまったく Message を持つことができないようになりました

Address2 番目の状況では、常に fromと常に toがあることを除いて、問題は非常に似ていAddressます。多重度を 1--* に設定するのは、私には正しくないようです。ここでは、from 関連付けと to 関連付けの 2 つの関連付けが確実に存在する必要があると思います (両方ともAddressエンティティに移動します)。Messageただし、これは2 つの 1 または 2 つの 0..1 を持つ側で同じ問題を引き起こします。
ここで、アドレスには 2 つのメッセージがあります 現在、アドレスにはゼロから 2 つのメッセージがあります

私の質問は、EDM でこれを正しくモデル化するにはどうすればよいですか?

前もって感謝します。

更新 1:

質問を明確にするために、なぜそのようなモデルが必要なのかについて、少し背景情報を提供します。メッセージを作成できなければなりません。このメッセージでは、それが 1 人か 2 人かを特定する必要があります。これらの人の名前、姓、およびその他の一意でないプロパティを指定します (2 人が同じ名前を持つことができます)。これらすべてのプロパティをMessageエンティティ (fname1、lname1、fname2、lname2) にダンプできますが、それは悪い考えのようです。したがって、Personエンティティが生まれました。Personただし、これは多くのメッセージにリンクできるように見えるかもしれませんが、そうではありません。同じプロパティを持つ 2 人の異なる人物が存在する可能性があります。これらの人物が実生活で実際に同一人物であるかどうかを判断する方法はありません。

住所の場合も、同様の議論が成立します。2 つの住所の綴りは多少異なる場合がありますが、手紙に書いて郵送すると、どちらも同じ場所に届きます (例: sesamestreet または sesamestr.)。Addressしたがって、複数の に接続された 1 つのエンティティはありませんMessages。繰り返しますが、唯一の理由Addressは別のエンティティです。まったく同じプロパティを持つ em が 2 つあるからです。 メッセージのすべて メッセージの分割 データベース設計の観点からは、これは意味をなさないかもしれませんが、クラス図の観点からは、もう少し理にかなっているかもしれません。私は、EF の EDM はデータベース設計ではなく、ドメイン モデルのようなものであるべきだという印象を受けていたので、正しいことをしたと思います。

更新 2:

この場合、最善の方法と思われる方法を考えてみました。と の間にはほとんど違いがないので、と1..* の関連付けを許容できるようにしたいPerson1Person2思います。多くは2を意味するという事実は、下位層が処理するものになります。住所の場合、from と to はまったく異なります。どちらもアドレスですが、リストにできる気がしません。from アドレスと to アドレスを別々のエンティティに分割し、それらを from から継承させることができます。次に、各サブクラスに関連付けます。少しやり過ぎのように思えるかもしれませんが、ある時点で from アドレスは to アドレスとは異なる要件を持ち、したがって異なるプロパティを持つ可能性があると考えることができます。 MessagePersonAddressMessageソリューション

私は 100% 満足しているわけではありません (特に住所部分)。この解決策は問題ないかもしれませんが、コアの問題を回避できるように感じます。

4

2 に答える 2

0

最初の問題 (メッセージ - 人物) の場合:

重要な質問は、person1 を null 非許容にするかどうかです。そしてperson2?

あなたがスケッチした2番目の代替案は、メッセージが正確に1つのPerson1(メッセージの作成者など)を持つ必要があるため、null不可のプロパティであると考えると、私にはかなり問題ないように見えます。Person2 (たとえば、メッセージを最後に更新した人) は、null にするか、既存の人にリンクすることができます。罰金!

person クラスの観点から見ると、特定の人 (person エンティティのインスタンス) が作成者であるメッセージ用とそれらのメッセージ用の 2 つの関連付け (および折りたたまれた 2 つのナビゲーション プロパティ) があります。この特定の人が最後の更新者でした。プリティーファイン!ではない?このようにして、メッセージの観点からモデルをクエリできます (すべてのメッセージと、それを作成して最後に更新した各メッセージの人物も教えてください...) または...人物をクエリして、この人物が送信したすべてのメッセージを収集します作成された、または最後のアップデーターでした...取得しますか?

しかし、最終的には、Person1 と Person2 の null 可能性を許可するかどうかを決定する必要があります。

2 番目の質問は読みませんでしたが、同じようなものだと思います。それについてもアドバイスが必要ですか?ただ私に電話してください。

さらに。ビジネス/機能の観点から 2 人で十分な場合は、選択肢 2 をお勧めします。一方、メッセージを更新した人の完全な履歴とメッセージを作成した人の完全な履歴が必要な場合 (これは常に正確に 1 つです)、1 つのナビゲーション プロパティ Message.Creator (正確に 1 つ) と Message.Updaters ( 0 から多数)。分かりますか?個人の観点からは、メッセージの作成者 (0 から多数) またはメッセージの更新者 (0 から多数) である可能性があります。

于 2011-01-27T11:45:10.977 に答える
0

ふぅ...幸いなことに、メッセージ エンティティを逆コンパイルして、人物、メッセージ、アドレスなどのより論理的で再利用可能なエンティティにすることが重要であることがわかりました。私の謙虚な意見では、このデザインが必要です ->

再設計

したがって、 Person エンティティが誕生しました。ただし、これは Person が多くのメッセージにリンクできるように見えるかもしれませんが、そうではありません。同じプロパティを持つ 2 人の異なる人物が存在する可能性があります。これらの人物が実生活で実際に同一人物であるかどうかを判断する方法はありません。

これは私にはとても奇妙に聞こえます...たとえば、間違った入力があるかもしれません。しかし、それでも、ある人がより多くのメッセージを持っているかどうかはわかりません...そして、実際にはそうでない場合は、ビジネスコードでこれを処理して、特定の人が複数のメッセージに結び付けられるのを防ぐことができます...

**** アップデート *****

このようにモデル化する必要があります:

私のデザイン

于 2011-01-27T14:40:34.687 に答える