我研究了nhibernate连接,无法弄清楚连接是如何执行的。在示例中,它不提供要执行连接的列。这些是根据映射自动执行的吗?
如果我有2个实体并且它们之间有2个独立的关系怎么办?这意味着加入2个实体有多种可能性?
答案 0 :(得分:1)
答案是“这些是根据映射自动执行的”(如您所述)。
作为NHibernate映射一部分的任何C#对象(POCO实体)都明确地连接到底层表和列。实体级别(C#)上的任何关系都与DB表关系类似。
文档14.3. Associations and joins中的HQL 示例:
from Eg.Cat as cat
join cat.Mate as mate
left join cat.Kittens as kitten
...已完成,并从映射中获利。这提供了足够的信息, Cat 和 Mate 如何相关,如何加入它以获取 Kittens 的列表
来自文档5.1. Mapping declaration 的映射
<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Eg"
namespace="Eg">
<class name="Cat" table="CATS" discriminator-value="C">
<id name="Id" column="uid" type="Int64">
<generator class="hilo"/>
</id>
<discriminator column="subclass" type="Char"/>
<property name="BirthDate" type="Date"/>
<property name="Color" not-null="true"/>
<property name="Sex" not-null="true" update="false"/>
<property name="Weight"/>
<many-to-one name="Mate" column="mate_id"/>
<set name="Kittens">
<key column="mother_id"/>
<one-to-many class="Cat"/>
</set>
<subclass name="DomesticCat" discriminator-value="D">
<property name="Name" type="String"/>
</subclass>
</class>
<class name="Dog">
<!-- mapping for Dog could go here -->
</class>
</hibernate-mapping>
加入。因此,如果我们选择Mate,我们将使用表mate_id
中的列CATS
从其表中获取Mate。当我们需要具有相同类型(Cat)的子项时,我们将转到表CATS
并搜索列mother_id
等于当前{{}的所有记录1}}列值。
所以,“这些是基于映射自动执行的”