NHibernate之旅(14):探索NHibernate中使用视图

Posted brucemengbm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NHibernate之旅(14):探索NHibernate中使用视图相关的知识,希望对你有一定的参考价值。

本节内容

  • 引入
  • 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中怎样使用视图,是不是非常easy啊。

结语

通过这篇文章的展示,我们学习了在NHibernate中怎样使用视图,同表类似,仅仅是属性訪问权限不同罢了,假设你原来不知道怎样使用视图,网上到如今也没有相关资料认为无从下手,通过这篇文章的高速阅读,是不是使用视图非常easy,豁然开朗的样子(视图原来这样啊,没有什么神奇之处~~)。

下篇我们来看看NHibernate中使用储存过程,用过存储过程的朋友都知道。真是烦人,这个存储过程我真是弄了非常长时间。在实际运用中错误不断,我把它一一化解,请征集意见,大家说下篇是写一一化解的整个具体过程(涉及错误信息。怎样改动,2篇样子)还是直接讲正确方案(1篇搞定)。由你做主!

以上是关于NHibernate之旅(14):探索NHibernate中使用视图的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate之(14):探索NHibernate中使用视图

NHIbernate 和安全/业务层

NHibernate之旅系列文章导航

nhibernate教程--条件查询(Criteria Query)

如果我使用类似 NHibernate 的 ORM,为啥需要 LINQ?

使用 NHibernate 的示例查询