我們想一下,在數據庫中,多對一的情況,即是外建和主鍵的關係,這種情況是很常見的,那如何在NHibernate中來表示多對一的關係呢?
繼上節實體與數據庫的Xml映射標籤-NHibernate入門到精通系列6的內容,我們來看一下如何實現多對一的Xml映射:
一、NHibernate多對一關聯映配置
<many-to-one
name="PropertyName" 實體屬性名
column="column_name" 數據庫字段名
class="ClassName" NHibernate關聯的類名
cascade="all|none|save-update|delete" 級聯關係
fetch="join|select" 批次讀取
update="true|false" 啓用更新
insert="true|false" 啓用插入
property-ref="PropertyNameFromAssociatedClass" 指定關聯類的一個屬性,這個屬性將會和本外鍵相對應
access="field|property|nosetter|ClassName"
unique="true|false" 啓用生成唯一約束
optimistic-lock="true|false"
not-found="ignore|exception" 數據不存在,忽略還是拋異常。
/>
二:NHibernate多對一關的概念介紹
我們先看一張圖片:
本圖中:學生表有兩條記錄,它們分別對應了班級表的主鍵值爲“1”的同一條記錄。
所以這就是“多對一”的使用情景。
三:NHibernate多對一關聯映射插入和查詢示例
先來段示例代碼:
public void Save()
{
using (ISession session = this.sessionFactory.OpenSession())
{
var cls = new Class { Name = "2班" };
var liu = new Student { Name = "小冬", Class = cls };
var zhang = new Student { Name = "小三", Class = cls };
ITransaction tran = session.BeginTransaction();
try
{
//持久化“Class”類
session.Save(cls);
session.Save(liu);
session.Save(zhang);
tran.Commit();
}
catch(Exception ex)
{
tran.Rollback();
throw ex;
}
}
}
運行後如下圖:
這裏提示一下:
如果發現拋出“object references an unsaved transient instance - save the transient instance before flushing. Type: Domain.Class, Entity: Domain.Class”這樣的異常。
原因可能是:持久化Student類的實例後,Student類的實例變爲持久態(Persistent),而Class類的實例還是臨時態(Transient),當持久化一個持久態的實例時,若該實例引用了一個臨時態的實例,就會拋出這樣的異常。
本節簡單介紹到這裏,免的介紹的太複雜,大夥學習起來看似頭痛,如想學習更復雜的操作,也可以相關百度或google,從中追尋更多的知識面。