使用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>
Run Code Online (Sandbox Code Playgroud)
或者您可以创建一个实体"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>
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不做选项1?PersonAddress表有ID列的事实是否应该是一个实体本身,因此使用选项2?
给定具有父表和两个或更多子表的数据库模式.例如:

是否可以使用for xml语句创建一个输出以下XML的查询:
<?xml version="1.0"?>
<person>
<name>Joe Bloggs</name>
<age>25</age>
<address>
<streetAddress>123 Test Street</streetAddress>
<town>Example Town</town>
<postcode>A12 3BC</postcode>
</address>
<address>
<streetAddress>124 Test Street</streetAddress>
<town>Example Town</town>
<postcode>A12 3BC</postcode>
</address>
<contact>
<type>Home Phone</type>
<value>01234 567890</value>
</contact>
<contact>
<type>Work Phone</type>
<value>01987 654321</value>
</contact>
<contact>
<type>Email Address</type>
<value>joe@example.com</value>
</contact>
</person>
Run Code Online (Sandbox Code Playgroud)
我最初的尝试:
select person.name, person.age,
address.streetAddress, address.town, address.postcode,
contact.type, contact.value
from Person as person
left join Address as address on person.PersonID = address.PersonID
left join Contact as contact on person.PersonID = contact.PersonID
where person.PersonID …Run Code Online (Sandbox Code Playgroud)