Как мне моделировать кратность 2 в EF - PullRequest
1 голос
/ 27 января 2011

У меня есть две ситуации, когда я хотел бы что-то подобное.В моей модели у меня есть Message, который относится к одному или двум Persons.Кроме того, сообщение имеет связь с двумя Addresses, то есть a от Address и a до Address.

В первой ситуации с двумя Persons я хотел бы указать связь между Message и Person кратностью 1 --- 1..2 или указать две ассоциации, одна с 1--- 1 и другой с 1 --- 0..1.Однако я не могу (или не знаю, как) установить кратность в два.Я могу себе представить, что можно установить 1 - * с ограничением максимум 2 (однако я не знаю, как это сделать).
Добавляя две ассоциации, я чувствую себя немного странно, когдаЯ смотрю на сторону Message, потому что обе ассоциации имеют там 1, что указывает на то, что Person должно иметь два Messages, связанных с ним.Я мог бы захотеть что-то вроде 0..1 на стороне Message для обеих ассоциаций с ограничением xor на них или что-то в этом роде, но я не знаю, является ли это хорошей практикой или вообще возможно в EF.I want to specify that it's max 2 Now it looks like a Person has two different Messages Now it looks like a Person can have two or no Messages

Для второй ситуации проблема довольно схожа, за исключением того, что всегда есть значение от Address и всегда от а до Address.Установка кратности 1 - * не кажется мне подходящей.Здесь я бы предположил, что определенно должно быть две ассоциации, от и до ассоциации (которые случаются с обеими сущностями Address).Это, однако, приводит к той же проблеме на стороне Message с двумя 1 или двумя 0..1.
Here the Address has two Messages Now the Address has zero to two Messages

Так что мой вопрос, как мне правильно смоделировать этов EDM?

Заранее спасибо.

Обновление 1:

Чтобы прояснить вопрос, я дам небольшую справочную информацию о том, зачем мне нужна такая модель.Я должен быть в состоянии создать сообщение.В этом сообщении я должен указать, касается ли это одного или двух человек.Из этих лиц я указываю имя, фамилию и некоторые другие неуникальные свойства (два человека могут иметь одно и то же имя).Я мог бы сбросить все эти свойства в сущности Message (fname1, lname1, fname2, lname2), но это кажется плохой идеей.Следовательно, сущность Person родилась.Однако это может выглядеть так, как будто Person может быть связано со многими сообщениями, но это не так.Там могут быть два разных человека с одинаковыми свойствами.Невозможно определить, являются ли эти люди на самом деле одним и тем же человеком в реальной жизни или нет.

В случае адресов имеет место аналогичный аргумент.Два адреса могут быть написаны немного по-разному, но если я напишу их в письме и отправлю по почте, они оба прибудут в одно и то же место (например, sesamestreet или sesamestr.).Поэтому у меня нет одного Address объекта, подключенного к нескольким Messages.Опять же, единственная причина Address - это отдельная сущность, потому что у меня есть два из них с одинаковыми свойствами.Everything in message Message split up С точки зрения проектирования базы данных это может не иметь смысла, с точки зрения диаграммы классов это может иметь немного больше смысла.У меня сложилось впечатление, что EDM в EF должен быть не похож на дизайн базы данных, а скорее на модель предметной области, поэтому я надеюсь, что поступил правильно.

Обновление 2:

Iпросто подумал о том, что я думаю, может быть лучшим способом в этом случае.Поскольку между Person1 и Person2 практически нет различий, я чувствую, что связь между Message и Person 1 .. * приемлема.Тот факт, что многие означают два, будет чем-то для нижних уровней.В случае адреса, от и до весьма различны.Они оба адреса, но я не чувствую, что могу составить их список.Я мог бы разделить from и address на отдельные объекты и позволить им наследовать от Address.Затем свяжите Message с каждым из подклассов.Это может показаться немного излишним, но вы можете предположить, что адрес отправителя в какой-то момент может иметь другие требования, чем адрес, и, следовательно, другие свойства.The solution

Я не на 100% доволен, хотя (особенно с адресной частью).Это решение может быть или не быть в порядке, но я чувствую, что оно позволяет избежать основной проблемы.

Ответы [ 2 ]

0 голосов
/ 27 января 2011

Фу ... К счастью, вы увидели важность декомпиляции сущности сообщения в более логичные и повторно используемые сущности, такие как персона, сообщение и адрес. По моему скромному мнению, у вас должен быть такой дизайн ->

re-design

Следовательно, сущность Личность родилась. Тем не менее, это может выглядеть как человек может быть связан со многими сообщениями, но это не вариант. Может быть два разные люди с одинаковым свойства. Там нет никакого способа сказать являются ли эти люди на самом деле тот же человек в реальной жизни или нет.

Это звучит так странно для меня ... Хотя может быть неправильный ввод, например два человека, отражающие одного реального человека, но с опечаткой, например. Но, тем не менее, у человека может быть больше сообщений или нет ... И когда это действительно не так, вы можете обработать это в своем бизнес-коде, чтобы предотвратить привязку конкретного человека к нескольким сообщениям ...

**** Обновление *****

Я должен смоделировать это так:

My design

0 голосов
/ 27 января 2011

Для первой проблемы (Сообщение - Персона):

Важнейший вопрос: хотите ли вы, чтобы person1 не обнулялся?И person2?

Второй набросок, который вы набросали, выглядит довольно хорошо для меня, учитывая, что вам нужно, чтобы в сообщении было ровно 1 Person1 (скажем, создатель сообщения), так что это свойство не обнуляется.Person2 (скажем, человек, который последний раз обновил сообщение) может быть нулевым или связанным с существующим человеком.Отлично!

Что вы видите с точки зрения класса персонажа, так это то, что у него есть две ассоциации (и 2 навигационных свойства, которые вы свернули ...), одно для этих сообщений, где конкретный человек (экземпляр сущности человека)создатель и один для тех сообщений, где этот конкретный человек был последним обновителем.Довольно хорошо!Не так ли?Таким образом, вы можете запросить модель с точки зрения сообщения (дать мне все сообщения, а также лиц каждого сообщения, которое его создало и последний раз обновило ...) Или ... запросить человека и собрать все сообщения, которые этот человексоздан или был последним средством обновления ... получить его?

Но все сводится к определению, допускаете ли вы обнуляемость для Person1 и Person2.

Я не читал ваш второй вопрос, нодумаю, что это больше того же самого.нужен совет с этим тоже?Просто позвони мне.

Кроме того.Если с деловой / функциональной точки зрения достаточно двух человек, то альтернатива 2 - это путь.Если, с другой стороны, вам нужна полная история о людях, которые обновили сообщение, а также о том, кто его создал (это всегда будет ровно одно), вы получите одно свойство навигации Message.Creator (ровно одно) и Message.Updaters (0 для многих).Ты видишь?С точки зрения человека, он может быть создателем сообщений (от 0 до многих) или обновителем сообщений (от 0 до многих).

...