NHibernate测试的几个小问题

简介:

在使用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,如需转载请自行联系原作者

相关文章
|
Web App开发 测试技术 C#
搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (五)测试你的成果
本篇文章:主要介绍怎么使用这套框架。在做好配置等前期工作后。我们就是要与Mvc进行融合了。由于Mvc本人也是个初级入门者。对于这部分的研究还不是很深入。但是基本应用已经可以了。下面就让我们开始一个简单的应用实例吧: 第一步:添加control 在web项目中的controls文件夹下面添加一个UserController.cs文件。
1205 0
|
测试技术 数据库
NHibernate初探(四) 一对多关系测试示例
两个数据表 Customer,客户表,现有数据如下:   -------------------------------------------------------------- CustomerId  Version FirstName   LastName 1           2       Jimmy1      Clonee --------------------------------------------------------------   Version现在不用。
803 0
|
测试技术 数据库
NHibernate初探(三) 简单且完整的测试示例
按Lee的原例实现的测试解决方案。是进行以后各部分学习的基础。 (一)建立Domain类库项目。 这个项目主要用于持久类与嵌入的映射文件的存在库。 还以Customer为例子。 ·数据库中主要的三个字段:customerid,firstname,lastname ·持久类Customer的属性:Unid(这里用Unid,不用与数据库的customerid,主要目的是更好的理解mapping关系);FirstName;LastName ·引用类库:可能会用到Iesi.Collections.dll 这里代码我就不贴了。
783 0
|
测试技术 数据库
NHibernate初探(四) 一对多关系测试示例
两个数据表 Customer,客户表,现有数据如下:   -------------------------------------------------------------- CustomerId  Version FirstName   LastName 1           2       Jimmy1      Clonee --------------------------------------------------------------   Version现在不用。
880 0
|
数据格式 XML 数据库
NHibernate初探(五) 多对多关系测试示例
三个数据表 Order订单表 --------------------------------------------------------- orderid    orderdate  customer 1   2009-11-09 16:54:41.
670 0
|
14天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
60 11
|
2月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
66 3
|
3月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
81 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
4月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
274 7
Jmeter实现WebSocket协议的接口测试方法