关注NHibernate已N久了,由于各种原因一直处于理论状态,得些时间于是实践一把!
去年下的0.8版感觉有些老了,于是从SF上down下最新版本NHibernate-1.2.0.Alpha1-debug,呵,好久不见又多出好多新东东...
一,从例QuickStar例子说起
down下NH1.2后,竟然不能编译,查之,竟然少了SettingsFactory.cs及SqlLoader.cs两个文件,算了,还是下个DEMO看一下吧,于是就下了
DDLLY兄的QuickStar例子,但还是run不了,哦,user.hbm.xml,hibernate.cfg.xml未设为嵌入资源,go on,成功......
还算顺利,不过看到有configuration有几种配置(http://www.i170.com/article/22290),于是试一把
//Configuration cfg = new Configuration().Configure();
Configuration cfg = new Configuration();
把上面使用hibernate.cfg.xml资源文件的注释,改为下面使用app.config文件的,加入app.config文件
run,succeed!
二,DIY个DEMO
New控制台Project,引用nunit.framework,NHibernate(Ver1.2.0.Alpha1),实体类,Map文件,hibernate.cfg.xml文件
记得数据库用户名,密码
完成TestFixture测试类,build成功,Debugger调试
session.Save(newUser);出错了,错误信息为:Unknown entity class: NHibernateTest.User
或Configuration cfg = new Configuration().Configure();处出错,信息为:Type 'NHibernateTest.User' cannot be specified as proxy
why?调了半天还是没有一点头绪,竟然不认识实体类,Quickstar中不是很正常吗?
没办法,只有求助csdn(http://community.csdn.net/Expert/topic/4883/4883788.xml?temp=.3518946),有仁兄给出答案
为每实体类属性加上virtual关键字,这招还非常强,实体信息正常的插入至数据库...
虽然我的问题似乎得了解决,但我对这种解决方案存在疑惑,为什么QuickStar例子什么也没加,也可以正常呢?
于是决定看NH的源码,但我DOWN的源码不能编译,因为少文件啊,刚才那位仁兄在贴子中回复少的这两个文件可以删除?
但我用ILDASM.EXE看一下我引用的NHibernate.dll,得到的结果是SettingsFactory类是有存在的,是否此类必须存在,这个问题我决定查看一
下其它的版本,在0.8版本中我看到此类是必须需要的,它是BuildSessionFactory时用到的。
用ILDAMS查看Nhibernate.dll的0.8版本及1.2版本,我发现对于SettingsFactory类的实现基本是一样,虽然现在NH1.2版本没有,但能否考虑
把0.8版本中的两个文件加入到1.2版本中呢?于是我试一下,结论是我的想法是错误的!其中有些变量在NH1.2版本中都没有实现,如:
hibernate.use_outer_join(允许使用外连接抓取。) 在NH1.2版本中都找不到定义实现,所以说,NH1.2版本应该有很大改动(没看官方文章惹的
祸啊),NH1.2改动这么大,其它版本的呢?于是我又DOWN了NH1.0.1,查看之,没错,是存在的。
上面把NH0.8中的文件复制到NH1.2中去用荒谬的想法,虽然结论是失败的,但通过对NH源码的查看,我意识到Unknown entity class这个异常很
可能就是由于版本问题产生的,我程序中用的版本是NH1.2,新版本应该或多或少都会存在些不足的地方,虽然在实体类的属性加上Virtual可以解
决问题,但我更加相信这是缺陷...
最后我引用NH1.0.1的NHibernate.dll到我的测试项目,一切OK,也不用加Virtual了,都是偶DOWN的新版本若的祸,呵呵,被NHibernate晃点两天
的问题终于可以结束了!
三,附上一些测试文件
//User.cs
//User.hbm.xml
//hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.0">
<session-factory>
<!-- 属性 -->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">server=127.0.0.1;database=user;uid=sa;pwd=XX;</property>
<property name="show_sql">false</property>
<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
<property name="use_outer_join">true</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<!-- 映射文件 -->
<mapping assembly="NHibernateTest" />
</session-factory>
</hibernate-configuration>
//NUnit测试类