NHibernate测试的几个小问题

转载 2012年03月24日 16:51:41


在使用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 = newConfiguration().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-configurationxmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="NHibernate.Test">
    <propertyname="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>
    <propertyname="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    <mapping assembly="DomainLayer"/>
  </session-factory>
</hibernate-configuration>

相关文章推荐

下载nutz工程搭建环境测试过程中的几个小问题

这几天,经同事介绍想学习一下Nutz,至于有什么好处加为什么学,自已百度! 按照nutz手册 下载了nutz工程源码,一步一步配置,有几个地方需要注意一下! 运行 JUnit 测试 2. 创建连接配置...

关于多线程的几个小问题

  • 2014年01月23日 19:57
  • 6.99MB
  • 下载

2011-6-12 碰到的几个小问题

 (一)printf 问题:double i = 1;int j = 2;printf("i = %d, j = %d/n", i , j);那么得到的结果是:i = 0, j = 107269324...
  • Ididcan
  • Ididcan
  • 2011年06月12日 20:21
  • 692

[IOS] ASIHttpRequest库使用过程中发现的几个小问题

在IOS开发过程中,ASIHttpRequest库是最常用的网络库,功能强大,使用也非常方便。但是,在使用此库过程中,发现有几点小问题。网络上仔细搜索研究了好久,现记录于此。问题1:一个问题是,我发现...
  • arui319
  • arui319
  • 2013年06月13日 21:52
  • 6283

实习笔记:几个小问题

当你走向社会,不怕,因为我们有的是办法...纪念今天,憧憬明天,请为自己加油! -------------纪念chyxion开始新的生活 1: eclipse/myeclipse可以将在txt文档...

JavaWeb学习遇到的几个小问题

1.配置maven: ERROR: JAVA_HOME is set to an invalid directory 解决: JAVA_HOME的配置中不需要分号和/bin 2.使用Mye...

jquery的几个小问题

jquery1.6的中文api,api是王道http://www.css88.com/jqapi-1.6/ 转自 http://wjboy49.iteye.com/blog/400905 Q1...

小结几个小问题,关于数据库乱码,dialog

1、读取数据库中的中文时出现乱码问题 2、完全自定义的dialog 3、在xml文件中定义时间格式 1:数据库中文乱码 只要在Cursor读取时,用二进制的形式(getBolb())读...

关于mysql的几个小问题

1、Date问题 如果在程序中使用java.util.Date类型的话,那么
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NHibernate测试的几个小问题
举报原因:
原因补充:

(最多只允许输入30个字)