博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NHibernate]视图处理
阅读量:6770 次
发布时间:2019-06-26

本文共 3338 字,大约阅读时间需要 11 分钟。

目录

写在前面

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

文档与系列文章

 

 

 

视图

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

一个例子

添加视图的持久化类

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

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

编写映射文件CustomerOrderView.hbm.xml

1 
2
3
4
5
6
7
8
9
10
12
14
15
16
17

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

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

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

测试

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

1         ///  2         /// 根据客户id查询视图,获得客户信息,及下单信息。 3         ///  4         ///  5         /// 
6 public IList
GetCustomerOrderViewByCustomerId(Guid customerID) 7 { 8 ISession session = NHibernateHelper.GetSession(); 9 return session.CreateCriteria(typeof(CustomerOrderView))10 .Add(Restrictions.Eq("CustomerID", customerID))11 .List
();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 
2
3
4
5
6
7
8
9
10
12
14
15
16
17

异常解决参考文章:

结果

生成的sql语句

总结

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

参考文章:

转载于:https://www.cnblogs.com/wolf-sun/p/4082899.html

你可能感兴趣的文章
solr实现满足指定距离范围条件的搜索
查看>>
个推Node.js 微服务实践:基于容器的一站式命令行工具链
查看>>
Python每日一练0012
查看>>
研究人员用 AI 评估小血管病变,可预测病人患中风和痴呆的概率
查看>>
windows环境下 生成git公钥和私钥
查看>>
ONVIF测试方法及工具
查看>>
跨服务器查询
查看>>
Android之SpannableString、SpannableStringBuilder总结
查看>>
陌陌前端面试 - 凉面
查看>>
How to set up Conflux
查看>>
大数据时代,你的个人信息安全吗?
查看>>
javascript时间格式化
查看>>
Spring MVC基础
查看>>
linux运维实战练习-2015年8月30日课程作业(练习)安排
查看>>
给新手的最佳类Windows界面的Linux发行版
查看>>
Centos7下按照配置nexus2
查看>>
EC2上源安装vnstat
查看>>
我的友情链接
查看>>
CentOS 6网卡名称修改 以及 centos7 采用传统命名方式
查看>>
Zookeeper之——关于Zookeeper的那些事
查看>>