• NHibernate初探!


    关注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实体类

    //User.hbm.xml

    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 1false 0, yes 'Y', no 'N'</property>
      
    <!-- 映射文件 -->
      
    <mapping assembly="NHibernateTest" />
     
    </session-factory>
    </hibernate-configuration>

    //NUnit测试类

    Test
  • 相关阅读:
    C# 多线程 异步加载 窗体
    C# 多线程 异步加载 窗体
    C#中的Debug类
    C#中的Debug类
    C# DataGridView:为行头添加行号
    C# DataGridView:为行头添加行号
    向SqlParameter内动态添加参数
    向SqlParameter内动态添加参数
    C# params关键字
    C# params关键字
  • 原文地址:https://www.cnblogs.com/linfuguo/p/453227.html
Copyright © 2020-2023  润新知