本節內容
引入
1.持久化類
2.映射文件
3.測試
結語
引入
在數據庫操作中,我們除了對表操作,還有視圖、存儲過程等操作,這一篇和下篇來學習這些內容。這篇我們來學習如何在NHibernate中使用視圖。首先,我們在數據庫中建立一個名為viewCustomer視圖,選中CustomerId、Firstname、Lastname、OrderId、OrderDate項。
下面我們依次為這個視圖編寫持久化類和映射吧。
1.持久化類
同持久化數據庫中的表類似,我們需要對視圖持久化,定義視圖中的每個屬性,因為視圖是只讀的,所以在這裡我們只要把屬性的Setter設置為private訪問權限。具體做法如下:
在項目DomainModel層的Entities文件夾中新建CustomerView.cs類,編寫代碼如下:
namespace DomainModel.Entities
{
public class CustomerView
{
public virtual int CustomerId { get; private set; }
public virtual string Firstname { get; private set; }
public virtual string Lastname { get; private set; }
public virtual int OrderId { get; private set; }
public virtual DateTime OrderDate { get; private set; }
}
}
2.映射文件
在項目DomainModel層的Mappings文件夾中新建CustomerView.hbm.xml文件,與映射數據庫表類似,編寫代碼如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="DomainModel" namespace="DomainModel">
<class name="DomainModel.Entities.CustomerView,DomainModel"
table="viewCustomer" mutable="false" >
<id name="CustomerId" column="CustomerId" type="Int32">
<generator class="native" />
</id>
<property name="Firstname" column="Firstname" type="string" />
<property name="Lastname" column="Lastname" type="string" />
<property name="OrderId" column="OrderId" type="Int32" />
<property name="OrderDate" column="OrderDate" type="DateTime" />
</class>
</hibernate-mapping>
好了,到這裡我們准備工作就做完了,即完成了持久化和映射。下面我們可以使用視圖了。
3.測試
在數據訪問層(DAL)中編寫一個方法獲取訂單時間在orderDate之後的顧客列表,方法如下:
public IList<CustomerView> GetCustomerView(DateTime orderDate)
{
return _session.CreateCriteria(typeof(CustomerView))
.Add(Restrictions.Gt("OrderDate", orderDate))
.List<CustomerView>();
}
在數據訪問測試層(DAL.Test)中編寫一個方法由於測試上面的方法。首先調用這個方法查詢出訂單時間在2008年10月1日之後的顧客列表,斷言其訂單時間是否大於2008年10月1日。
[Test]
public void GetCustomerViewTest()
{
DateTime testorderDate = new DateTime(2008, 10, 1);
IList<CustomerView> customers =
_relation.GetCustomerView(testorderDate);
foreach (CustomerView view in customers)
{
Assert.GreaterOrEqual(view.OrderDate, testorderDate);
}
}
OK!測試通過,NHibernate生成SQL語句如下:
SELECT this_.CustomerId as CustomerId0_0_,
this_.Firstname as Firstname0_0_,
this_.Lastname as Lastname0_0_,
this_.OrderId as OrderId0_0_,
this_.OrderDate as OrderDate0_0_
FROM viewCustomer this_
WHERE this_.OrderDate > @p0; @p0 = '2008/10/1 0:00:00'
好了,到此我們學會了在NHibernate中如何使用視圖,是不是很簡單啊。
結語
通過這篇文章的展示,我們學習了在NHibernate中如何使用視圖,同表類似,只是屬性訪問權限不同罷了,如果你原來不知道如何使用視圖,網上到現在也沒有相關資料覺得無從下手,通過這篇文章的快速閱讀,是不是使用視圖非常簡單,豁然開朗的樣子(視圖原來這樣啊,沒有什麼神秘之處~~)。下篇我們來看看NHibernate中使用儲存過程,用過存儲過程的朋友都知道,真是煩人,這個存儲過程我真是弄了很長時間,在實際運用中錯誤不斷,我把它一一化解,請征集意見,大家說下篇是寫一一化解的整個詳細過程(涉及錯誤信息,如何修改,2篇樣子)還是直接講正確方案(1篇搞定)。由你做主!