NHibernate: Почему вы используете <составной элемент> над <один-ко-многим>, чтобы отобразить коллекцию - PullRequest
8 голосов
/ 30 ноября 2010

При использовании NHibernate, при каких обстоятельствах вы бы выбрали отображение коллекции, используя составной элемент, чтобы дать коллекцию объектов-значений, а не создавать полноценный объект и отображать его, используя один ко многим?

Возможно, у вас есть класс типа значений «PostalAddress» для представления адреса. Если у вас есть физическое лицо, и у каждого человека может быть много адресов, вы можете сопоставить эти отношения следующим образом (Вариант 1):

<bag name="Addresses" table="PersonAddress">
    <key column="PersonID"/>
    <composite-element class="PostalAddress">
        <property name="StreetAddress"/>
        <property name="Town"/>
        <property name="City"/>
        <property name="Postcode"/>
    </composite-element>
</bag>

Или вы можете создать сущность PersonAddress, в которой есть типизированное свойство PostalAddress, и сопоставить адреса с привязкой «один ко многим» (вариант 2):

<bag name="Addresses">
    <key column="PersonID"/>
    <one-to-many class="PersonAddress"/>
</bag>

<class name="PersonAddress">

    <id name="Id">
        <generator class="native"/>
    </id>

    <component name="Address" class="PostalAddress">
        <property name="StreetAddress"/>
        <property name="Town"/>
        <property name="City"/>
        <property name="Postcode"/>
    </component>

</class>

Есть ли причины не делать вариант 1? Предполагает ли тот факт, что таблица PersonAddress имеет столбец идентификаторов, предполагает, что она должна быть самой сущностью, поэтому используйте вариант 2?

1 Ответ

19 голосов
/ 30 ноября 2010

для того, когда у вас есть коллекция значений, тогда какэто коллекция сущностей.Определяющей характеристикой объекта является уникальный идентификатор.Так что, если предметы в вашей коллекции имеют PK, используйте,В противном случае используйте.

Еще один способ думать об этом - это как вы определяете равенство.Вы определяете равенство, сравнивая идентификатор или проверяя идентичность всех свойств?Например, в вашем приложении два объекта представляют один и тот же адрес if (address1.Id == address2.Id) или if (address1.Street == address2.Street && address1.City == address2.City && и т. д.)?Универсального правильного ответа не существует, так как это зависит от контекста приложения.Во многих случаях деньги являются ценным объектом.Если у вас есть эти 20 или 20 долларов, это не имеет значения.Уместна только сумма.Если вы пишете приложение для отслеживания монетного двора, им, вероятно, нужно знать, с каким 20-долларовым счетом вы имеете дело, и вы бы отслеживали серийный номер на 20-долларовом счете.В этом случае деньги это сущность.Все зависит от приложения и контекста ...

...