本节内容

  • 引入
  • 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中使用视图的更多相关文章

  1. NHibernate之旅系列文章导航

    NHibernate之旅系列文章导航 宣传语 NHibernate.NHibernate教程.NHibernate入门.NHibernate下载.NHibernate教程中文版.NHibernate实 ...

  2. [转]NHibernate之旅(10):探索父子(一对多)关联查询

    本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...

  3. NHibernate之旅(21):探索对象状态

    本节内容 引入 对象状态 对象状态转换 结语 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的 ...

  4. NHibernate之旅(18):初探代码生成工具使用

    本节内容 引入 代码生成工具 结语 引入 我们花了大量的篇幅介绍了相关NHibernate的知识.一直都是带着大家手动编写代码,首先创建数据库架构.然后编写持久化类和映射文件,最后编写数据操作方法.測 ...

  5. [转]NHibernate之旅(12):初探延迟加载机制

    本节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这 ...

  6. Fluent NHibernate之旅

    Fluent NHibernate 之旅 导航篇: [原创]Fluent NHibernate之旅开篇: [原创]Fluent NHibernate之旅二--Entity Mapping: [原创]F ...

  7. [转]NHibernate之旅(1):开篇有益

    本节内容 NHibernate是什么 NHibernate的架构 NHibernate资源 欢迎加入NHibernate中文社区 作者注:2009-11-06已更新 NHibernate开篇有益 学习 ...

  8. NHibernate系列文章八:NHibernate对象一级缓存

    摘要 Nhibernatea缓存非常强大,按照缓存存储在Session对象还是SessionFactory对象分为一级缓存和二级缓存. 一级缓存存在于Session对象里,也叫Session缓存,由S ...

  9. 通俗易懂的Nhibernate教程(2) ---- 配置之Nhibernate配置

    在上一个教程中,我们讲了Nhibernate的基本使用!So,让我们回顾下Nhibernate使用基本的步骤吧 1.NHibernate配置  ----- 这一步我们告诉了Nhibernate:数据库 ...

随机推荐

  1. 确定比赛名次--hdoj

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  2. 纯JS监听document是否加载完成

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 概述 一个document 的 Document.readyState 属性描述了文档的加载状态. 一个文档的 read ...

  3. 如何让音频跟视频在ios跟android上自动播放

    如何让音频跟视频在ios跟android上自动播放 <audio autoplay ><source src="audio/alarm1.mp3" type=&q ...

  4. Redis(一)、Redis五种数据结构

    Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安 ...

  5. H3BPM表单设计器公式设计参考

    表单设计器公式设计参考 整体说明 Ø 公式以javascript方式解析,最终支持JS语法或计算方式: Ø 公式变量以数据项为主,以{}符号表示数据项,例如数据项A,表示为{A}:如果是子表中的数据项 ...

  6. springmvc-servlet.xml 第二种选择

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. WPF使用Winform PDFView控件

    最近开发wpf项目中有一个模块需要显示PDF文件内容.由于WPF本身没有PDF加载控件(似乎有收费的我查到过类似的资料.如果有新的pdf控件也请通知我一下谢谢). 项目使用之前也是从网上获取的资料,因 ...

  8. 利用JavaScript的%读分秒

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. javascript中天气接口案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 错误:Camera录制视频(6.0错误),5.1正常,7.1正常 (java.lang.RuntimeException: start failed.at android.media.MediaRecorder.native_start(Native Method))

    Process: com.example.mycamera2, PID: 24086 java.lang.RuntimeException: start failed. at android.medi ...