本節內容主要分兩個方面進行介紹:
1:單向映射
2:雙向映射
下面讓我們開始介紹:
一、NHibernate單向映射
還是照舊,先上圖:
一個班級有多個學生,一對多!其實也可以反過來說,多個學生對一個班級,多對一。
接然仍舊,上Xml配置。
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="Student" table="T_Student" lazy="true" >
<id name="ID" type="int" column="StudentID">
<generator class="native"/>
</id>
<property name="Name" type="string">
<column name="Name" length="51"/>
</property>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="Class" table="T_Class" lazy="true" >
<id name="ID" type="int" column="ClassID">
<generator class="native"/>
</id>
<property name="Name" type="string">
<column name="Name" length="51"/>
</property>
<bag name="Students">
<key column="ClassID"/>
<one-to-many class="Student"/>
</bag>
</class>
</hibernate-mapping>
這裏有一點說明:
Class中Students映射類型爲:IList<Student>。即是用<bag>和<one-to-many>標籤來描述“一對多”關聯映射。
單元測試就省略了,大夥見的太多,不羅嗦!
二、NHibernate雙向映射
雙向就是互相關聯映射了,這裏上Xml配置:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="Student" table="T_Student" lazy="true" >
<id name="ID" type="int" column="StudentID">
<generator class="native"/>
</id>
<property name="Name" type="string">
<column name="Name" length="50"/>
</property>
<many-to-one name="Class" column="ClassID" />
</class>
</hibernate-mapping>
說明:
若Class屬性修改爲不允許空,而值爲空,將拋出“not-null property references a null or transient value”的異常。
如果允許爲空,我們修改下Xml映射爲:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="Class" table="T_Class" lazy="true" >
<id name="ID" type="int" column="ClassID">
<generator class="native"/>
</id>
<property name="Name" type="string">
<column name="Name" length="50"/>
</property>
<!--設置爲不可空-->
<bag name="Students" inverse="true" cascade="all">
<key column="ClassID" not-null="true"/>
<one-to-many class="Student"/>
</bag>
</class>
</hibernate-mapping>
這樣爲空時便宜不會拋異常了。
本節NHibernate一對多單雙向關聯映射就輕鬆講解到這了,歡迎期待下一節。