转自:http://www.cnblogs.com/wolf-sun/p/4082899.html

目录

写在前面

文档与系列文章

视图

一个例子

总结

写在前面

前面的文章主要讲了对物理数据表的操作,当然了Nhibernate同样可以操作视图,本文将讲nhibernate对视图操作的种种。

文档与系列文章

[Nhibernate]体系结构

[NHibernate]ISessionFactory配置

[NHibernate]持久化类(Persistent Classes)

[NHibernate]O/R Mapping基础

[NHibernate]集合类(Collections)映射 

[NHibernate]关联映射

[NHibernate]Parent/Child

[NHibernate]缓存(NHibernate.Caches)

[NHibernate]NHibernate.Tool.hbm2net

[NHibernate]Nullables

[NHibernate]Nhibernate如何映射sqlserver中image字段

[NHibernate]基本配置与测试 

[NHibernate]HQL查询 

[NHibernate]条件查询Criteria Query

[NHibernate]增删改操作

[NHibernate]事务

[NHibernate]并发控制

[NHibernate]组件之依赖对象

[NHibernate]一对多关系(级联删除,级联添加)

[NHibernate]一对多关系(关联查询)

[NHibernate]多对多关系(关联查询)

[NHibernate]延迟加载

[NHibernate]立即加载

视图

首先创建一个VW_CustomerOrder(采用同数据表相同的命名规则,如数据表TB_Customer)的视图,选中CustomerID,CustomerName,CustomerAddress,OrderID,OrderDate字段

一个例子

添加视图的持久化类

 1 namespace Wolfy.Shop.Domain.Entities
2 {
3 /// <summary>
4 /// 描述:客户订单视图持久化类
5 /// 创建人:wolfy
6 /// 创建时间:2014-11-08
7 /// </summary>
8 public class CustomerOrderView
9 {
10 /// <summary>
11 /// 客户id
12 /// </summary>
13 public virtual Guid CustomerID { get;private set; }
14 /// <summary>
15 /// 客户姓名
16 /// </summary>
17 public virtual string CustomerName { get; private set; }
18 /// <summary>
19 /// 客户住址
20 /// </summary>
21 public virtual string CustomerAddress { get; private set; }
22 /// <summary>
23 /// 订单id
24 /// </summary>
25 public virtual Guid OrderID { private set; get; }
26 /// <summary>
27 /// 下单时间
28 /// </summary>
29 public virtual DateTime OrderDate {private set; get; }
30 }
31 }

注意:对视图最常用的是查询操作,视图是一张虚表,也就是只读的(数据的来源是来自物理表的)。所以这里将持久化类的属性设置为只读的(private set)就可以了,如果真想修改数据了,就通过修改物理表的数据。
编写映射文件CustomerOrderView.hbm.xml

 1 <?xml version="1.0" encoding="utf-8" ?>
2 <!--assembly:程序集,namespace:命名空间-->
3 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Wolfy.Shop.Domain" namespace="Wolfy.Shop.Domain.Entities">
4 <class name="Wolfy.Shop.Domain.Entities.CustomerOrderView,Wolfy.Shop.Domain" table="VW_CusomterOrder" mutable="false">
5 <!--主键-->
6 <id name="CustomerID" type="Guid" unsaved-value="null">
7 <column name="CustomerID" sql-type="uniqueidentifier" not-null="true" unique="true"/>
8 <generator class="assigned"></generator>
9 </id>
10 <property name="CustomerName" column ="CustomerName" type="string"
11 length="16" not-null="false" />
12 <property name ="CustomerAddress" column="CustomerAddress" type="string"
13 length="128" not-null="false" />
14 <property name="OrderID" column="OrderID" type="Guid" not-null="true"/>
15 <property name="OrderDate" column="OrderDate" type="DateTime" />
16 </class>
17 </hibernate-mapping>

注意:1,在nhibernate中使用视图的时候,最容易忽略的就是没有给视图指定主键,这种情况下很容易出错。

2,注意映射文件中class节点指定mutable="false"属性(对对象的修改不能持久化到数据库中)。

3,记得添加过映射文件,修改hbm.xml属性为嵌入资源

测试

获取某客户下面所有的订单信息。

 1         /// <summary>
2 /// 根据客户id查询视图,获得客户信息,及下单信息。
3 /// </summary>
4 /// <param name="guid"></param>
5 /// <returns></returns>
6 public IList<CustomerOrderView> GetCustomerOrderViewByCustomerId(Guid customerID)
7 {
8 ISession session = NHibernateHelper.GetSession();
9 return session.CreateCriteria(typeof(CustomerOrderView))
10 .Add(Restrictions.Eq("CustomerID", customerID))
11 .List<CustomerOrderView>();
12 }

此时会有一个异常

 1 “NHibernate.InvalidProxyTypeException”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理
2
3 其他信息: The following types may not be used as proxies:
4
5 Wolfy.Shop.Domain.Entities.CustomerOrderView: method set_CustomerID should be 'public/protected virtual' or 'protected internal virtual'
6
7 Wolfy.Shop.Domain.Entities.CustomerOrderView: method set_CustomerName should be 'public/protected virtual' or 'protected internal virtual'
8
9 Wolfy.Shop.Domain.Entities.CustomerOrderView: method set_CustomerAddress should be 'public/protected virtual' or 'protected internal virtual'
10
11 Wolfy.Shop.Domain.Entities.CustomerOrderView: method set_OrderID should be 'public/protected virtual' or 'protected internal virtual'
12
13 Wolfy.Shop.Domain.Entities.CustomerOrderView: method set_OrderDate should be 'public/protected virtual' or 'protected internal virtual'

意思已经很明白了,说属性的set方法,应该是Public或者Protect virtual的。解决办法,要么修改回默认的public,要么修改映射文件的默认加载方式将hibernate-mapping的default-lazy属性设置为false。让他立即加载。

 1 <?xml version="1.0" encoding="utf-8" ?>
2 <!--assembly:程序集,namespace:命名空间-->
3 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Wolfy.Shop.Domain" namespace="Wolfy.Shop.Domain.Entities" default-lazy="false">
4 <class name="Wolfy.Shop.Domain.Entities.CustomerOrderView,Wolfy.Shop.Domain" table="VW_CusomterOrder" mutable="false">
5 <!--主键-->
6 <id name="CustomerID" type="Guid" unsaved-value="null">
7 <column name="CustomerID" sql-type="uniqueidentifier" not-null="true" unique="true"/>
8 <generator class="assigned"></generator>
9 </id>
10 <property name="CustomerName" column ="CustomerName" type="string"
11 length="16" not-null="false" />
12 <property name ="CustomerAddress" column="CustomerAddress" type="string"
13 length="128" not-null="false" />
14 <property name="OrderID" column="OrderID" type="Guid" not-null="true"/>
15 <property name="OrderDate" column="OrderDate" type="DateTime" />
16 </class>
17 </hibernate-mapping>

异常解决参考文章:http://blog.csdn.net/sunlihgt_love/article/details/4298131

结果

生成的sql语句

总结

本文介绍了在nhibernate中使用视图的内容,遇到一个bug,将解决bug的过程分享了一下,遇到bug不要慌,解决了一个bug,你就会对它印象深刻,至少下次再遇到了,你知道如何去解决了,也是一种进步,不要怕犯错。

参考文章:http://www.cnblogs.com/lyj/archive/2008/11/01/1324201.html

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。
技术交流群: 329276418

转:[NHibernate]视图处理的更多相关文章

  1. [NHibernate]视图处理

    目录 写在前面 文档与系列文章 视图 一个例子 总结 写在前面 前面的文章主要讲了对物理数据表的操作,当然了Nhibernate同样可以操作视图,本文将讲nhibernate对视图操作的种种. 文档与 ...

  2. [Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图

    目录 写在前面 文档与系列文章 表及其约束 存储过程 视图 总结 写在前面 由于一直在山西出差,有几天没更新博客了.昨晚回到家,将博客园最近三天更新的文章搜集了一下,花费了半天的时间,看了看,有些文章 ...

  3. 耗时两月,NHibernate系列出炉

    写在前面 这篇总结本来是昨天要写的,可昨天大学班长来视察工作,多喝了点,回来就倒头就睡了,也就把这篇总结的文章拖到了今天. nhibernate系列从开始着手写,到现在前后耗费大概两个月的时间,通过总 ...

  4. [NHibernate]N+1 Select查询问题分析

    目录 写在前面 文档与系列文章 N+1 Select查询问题分析 总结 写在前面 在前面的文章(延迟加载,立即加载)中都提到了N+1 Select的问题,总觉得理解的很不到位,也请大家原谅,这也是为什 ...

  5. [NHibernate]存储过程的使用(一)

    目录 写在前面 文档与系列文章 Nhibernate中使用存储过程 一个例子 总结 写在前面 上篇文章一个小插曲,分析了延迟加载是如何解决N+1 select查询问题的.这篇开始介绍在nhiberna ...

  6. [NHibernate]存储过程的使用(二)

    目录 写在前面 文档与系列文章 创建对象 更新对象 总结 写在前面 上篇文章介绍了如何使用MyGeneration代码生成器生成存储过程,以及nhibernate中通过存储过程删除数据的内容,这篇文章 ...

  7. [NHibernate]存储过程的使用(三)

    目录 写在前面 文档与系列文章 查询 总结 写在前面 前面的文章介绍了在nhibernate中使用存储过程进行增删改的操作,当然查询也是可以的,在nhibernate中也可以执行任意的存储过程.本篇文 ...

  8. [NHibernate]代码生成器的使用

    目录 写在前面 文档与系列文章 代码生成器的使用 总结 写在前面 前面的文章介绍了nhibernate的相关知识,都是自己手敲的代码,有时候显得特别的麻烦,比如你必须编写持久化类,映射文件等等,举得例 ...

  9. [Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

    目录 写在前面 文档与系列文章 SchemaExport工具 SchemaUpdate工具 一个例子 总结 写在前面 上篇文章介绍了使用代码生成器的nhibernate模版来生成持久化类,映射文件等内 ...

随机推荐

  1. [转]JS脚本抢腾讯云学生1元代金券

    转自:http://blog.csdn.net/lkxlaz/article/details/54909397 今天抢代金券,在网上看到的,虽然脚本很easy,但也mark一下吧. //make th ...

  2. Dubbo—Zookeeper的典型应用

    1.Zookeeper 作为 Hadoop 项目中的一个子项目,是 Hadoop 集群管理的一个必不可少的模块,它主要用来控制集群中的数据,如它管理 Hadoop 集群中的 NameNode,还有 H ...

  3. oracle 存储过程中使用date 时、分、秒丢失

    今天有一开发兄弟找我.说出现一奇怪现象,在存储过程中赋date类型的值,时.分.秒都丢失了,以下来做个试验: SQL> drop table test purge; SQL> create ...

  4. OpenWrt 安装usb支持

    (一)下载软件 1)komd-usb-ohci kmod-usb2 kmod-usb-storage kmod-usb-core 这些是USB驱动包 2) kmod-nls-base kmod-nls ...

  5. Oracle RAC功能测试

    Oracle RAC是一个集群数据库,可以实现负载均衡和故障无缝切换.如何知道RAC数据库已经实现了这些功能呢,下面就对此进行功能测试. 一. 负载均衡测试RAC数据库的负载均衡是指对数据库连接的负载 ...

  6. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...

  7. flex组合流动布局实例---利用css的order属性改变盒子排列顺序

    flex弹性盒子 <div class="container"> <div class="box yellow"></div> ...

  8. HttpURLConnection 当作请求调用接口不带返回参数的工具类

    package cn.smartercampus.core.util; import java.io.BufferedReader; import java.io.InputStream; impor ...

  9. Java日期类:Date和Calendar的使用

    总是使用这两个类,总是需要百度.还不如一次全部整理完. 一.介绍: Date 类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年 ...

  10. python文件上传工具实现

    0x00 之前验收waf模块webshell效果,组网pc--waf--webserver,收集网络上的webshell样本,进行上传测试.由于数量较多8000+个样本, 只好写了个工具进行验收. w ...