在使用NHibernate时,我发现有许多陷阱,看似微不足道,如果不明白,就会阻碍我们的开发,乃至于影响到开发效率,成为开发的拦路虎。

1、首先是映射的实体类,例如Customer类。由于我采用DDD的方式,将领域逻辑也放入到该实体类中,且通过构造函数传入了一个Repository对象,代码如下:

public class Customer {
????private ICustomerRepository m_repository;
????public virtual int CustomerID {
????????get;
????????set;
????}
????public virtual string Name {
????????get;
????????set;
????}
????public virtual DateTime Birthday {
????????get;
????????set;
????}
????public virtual string Address {
????????get;
????????set;
????}
????public Customer(ICustomerRepository repository) {
????????m_repository = repository;
????}
????public Customer Load(int customerID) {
????????return m_repository.Load(customerID);
????}
}

这样的定义会导致无法进行Mapping,会抛出NHibernate.InvalidProxyTypeException异常。原因在于如果实体类定义了一个带参的构造函数,则必须显式地定义一个无参的构造函数。此外,定义在Customer类中的方法,同样必须加上virtual关键字。

public Customer() {
}
public virtual Customer Load(int customerID) {
????return m_repository.Load(customerID);
}

2、如果使用Visual Studio Team Suite自带的测试框架,则会带来无法找到hibernate.cfg.xml文件的问题。在一般的测试框架下,我们可以将该文件的Copy to output directory属性设置为“copy always”即可。但由于VSTS自带的测试框架会将相关文件放到自动生成的TestResult下的临时文件夹中。因此,可能会抛出如下的异常:

NHibernate.Cfg.HibernateConfigException: An exception occurred during configuration of persistence layer. --->  System.IO.DirectoryNotFoundException: 未能找到路径“C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies;PrivateAssemblies\hibernate.cfg.xml”的一部分。

一个简单的解决方案时将hibernate.cfg.xml拷贝到TestResult目录下,并将构建SessionFactory对象的方法修改为:

ISessionFactory factory = new Configuration().Configure(@"./../../hibernate.cfg.xml").BuildSessionFactory();

好在这只是为了测试而做,所以方案变得如此丑陋,也是可以接受的。

3、关于hbm文件。一般来说,我们需要将实体对象的hbm文件例如customer.hbm.xml文件的Build Action属性设置为Embedded Resource即可。若要验证该属性的设置是否生效,可以通过Reflector查看该程序集下的Resource。如下图:nhibernatereflector

然而,如果hibernate.cfg.xml的设置有错,仍然会抛出如下异常:NHibernate.MappingException : No persister for: DomainLayer.Entities.Customer。

我们需要在hibernate.cfg.xml文件中增加<mapping>:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2"> 
  <session-factory name="NHibernate.Test"> 
    <property name="connection.driver_class"> 
      NHibernate.Driver.SqlClientDriver 
    </property> 
    <property name="connection.connection_string"> 
      Data Source=.\SQLEXPRESS;Initial Catalog=EBusiness; 
      Integrated Security=True;Pooling=False 
    </property> 
    <property name="adonet.batch_size">10</property> 
    <property name="show_sql">true</property> 
    <property name="dialect"> 
      NHibernate.Dialect.MsSql2005Dialect 
    </property> 
    <property name="use_outer_join">true</property> 
    <property name="command_timeout">60</property> 
    <property name="query.substitutions"> 
      true 1, false 0, yes 'Y', no 'N' 
    </property> 
    <property name="proxyfactory.factory_class"> 
      NHibernate.ByteCode.Castle.ProxyFactoryFactory, 
      NHibernate.ByteCode.Castle 
    </property> 
    <mapping assembly="DomainLayer"/> 
  </session-factory> 
</hibernate-configuration>

本文转自wayfarer51CTO博客,原文链接:http://blog.51cto.com/wayfarer/310549,如需转载请自行联系原作者

NHibernate测试的几个小问题相关推荐

  1. 趣味小测试.C-Golang-Python的性能小对比

    趣味小测试.C-Golang-Python的性能小对比 采用三种语言执行经典的求素数. 求输入一个数,求出这个数以内的所有素数.并打印个数 注 1.此处并未采用算法来优化 2.Golang未使用协程, ...

  2. 用Java测试电脑速度的小方法

    Java测试电脑速度的小方法 用System类中的currentTimeMillis()方法 public static long currentTimeMillis() 返回当前时间(以毫秒为单位) ...

  3. 从零开始自制实现WebServer(十八)---- 对服务器做最后的压力测试 WebBench压测小工具 项目迎来终章

    文章目录 全流程实现博客链接 前引 (十八)---- 对服务器做最后的压力测试 WebBench压测小工具 项目迎来终章 1.正确处理Vmware-Station 处理器设置(初步调试过程) 2.正确 ...

  4. 实用的智力测试智商提升微信小程序源码下载

    这是一个考验智力,心里上面的一个测试游戏 支持多种测试方法比如有: 智商测试丨情商测试 性格测试丨爱情测试 抑郁症测试丨焦虑症测试 心理压力测试丨生活满意度测试 通过不同的测试,来检查你的智力,情商等 ...

  5. 小程序源码:实用的智力测试智商提升微信小程序-多玩法安装简单

    这是一个考验智力,心里上面的一个测试游戏 支持多种测试方法比如有: ​ 编辑 通过发行自己的不住来弥补自己的不足 所以这就是为什么小编会说是一个实用的小程序 另外也是支持流量主模式的,大家自己到时候替 ...

  6. 测试/开发程序员小张相亲记......

    目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...

  7. NHibernate 状态的概念 以及 小测试

    在 NHibernate中有三种状态. 临时态(Transient):用new创建的对象,它没有持久化,没有纳入Session中,随时可以被垃圾回收,处于此状态的对象叫临时对象.特点:数据库中没有与之 ...

  8. 测试方案_何小伟:ABTest测试方案

    一.什么是ABTest测试 ABTest的目的和意图是判断哪种种UI或rerank策略更优,通过事实的依据( CTR或下单率/成交量.....)判断哪种策略更符合用户的习惯和需求,多用于产品发布时的最 ...

  9. c++指定在某一线程运行_iPhone11升级iOS14运行速度测试:结果有点小惊喜

    苹果已经发布了iOS14测试版,不知道各位果粉有没有第一时间升级体验新功能.之前给大家测试了几款旧iPhone升级后的运行速度表现,结果令人失望.而今天就单独对iPhone11来一次测试,升级iOS1 ...

最新文章

  1. R语言使用beanplot包绘制豆荚图实战:与箱图、小提琴图对比、绘制不对称的豆荚图
  2. vim 忽略大小写查找字符串
  3. 为什么要叫python-为什么我们要学习Python?
  4. Python基础数据类型之set集合
  5. LoadRunner脚本增强技巧之检查点
  6. python入门——P36类和对象:给大家介绍对象
  7. mockito无效_Mockito模拟无效方法
  8. mysql与oracle存储过程_MySQL与Oracle差异比较之五存储过程Function
  9. pycharm中的常用快捷键与常用设置
  10. JavaScript面向对象轻松入门之概述(demo by ES5、ES6、TypeScript)
  11. 均方根值、均方根误差以及标准差的区别
  12. RoadMap:面向自动驾驶视觉定位的轻量级语义地图(ICRA2021)
  13. com.baomidou.mybatisplus.core.exceptions.MyBatisPlusException: java.net.UnknownHostException
  14. 清除node_modules 缓存
  15. 【论文投稿】Hindawi旗下4区Mobile Information Systems(misy)投稿详细步骤
  16. 你的电脑遇到问题,需要重新启动的解决思路
  17. 【经验】怎么把Word文字下面的红线去掉?
  18. export / import与module.exports/require的关系与用法
  19. SKU110K商品检测数据集处理
  20. 八道超经典指针面试题(三千字详解)

热门文章

  1. 中科院陈玉福算法设计与分析 动态规划矩阵连乘计算问题
  2. Leetcode 503:下一个更大元素 II(超详细的解法!!!)
  3. 51单片机最小系统制作笔记
  4. SV学习笔记—随机化约束的概率
  5. 四大组件以及 Application和Context的全面理解
  6. 分享147个ASP源码,总有一款适合您
  7. 西安交大城市学院计算机怎么,西安交大城市学院计算机系在“量子计算机”教研领域获得显著进展...
  8. 电脑一打开计算机硬盘就嗡嗡,电脑主机嗡嗡响 怎么解决?
  9. 专访 Zipkin 项目 Leader:如何用 Zipkin 做好分布式追踪?
  10. as死机了怎么办_电脑老出现Dllc:windowssystem32asadhip.dll而且老死机怎么处理、高手求救...