NHibernate初体验[转]

 

ORM和codesimith等的代码生成工具是互补的,当然我们要可以抛开ORM,直接用代码生成工具也可以。

下面是一篇文章,关于nhibernate和codesimith互相补充使用的实践文章。

出处: http://www.cnblogs.com/lordeo/archive/2007/12/29/1019842.html

 

 

Hibernate是Java下久负盛名的开源持久层开发框架,使用起来是相当顺手,那么.Net下的NHibernate如何呢?带着点好奇,开始了NHibernate之初体验。
    按照QuickStart中描述的过程,却不能顺利通过,经常出现各种个样的错误,网上的资料还奇缺,搜索来搜索去也大半都是遇到同样困惑的人互相提问,毫无出路,经过2天的烦恼之后,终于还是通过了,过程如下:
1.下载Nhibernate1.2.0GA,安装。并没有什么界面出现,这个安装就是解压一样,早知道下载zip版本的。
2.建立数据库,建立表,图省事,就用易装网的用户表了。定义如下:

 1 CREATE   TABLE   [ dbo ] . [ User ]  (
 2      [ UserID ]   [ int ]   IDENTITY  ( 1 1 NOT   NULL  ,
 3      [ UserName ]   [ nvarchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NOT   NULL  ,
 4      [ Password ]   [ varchar ]  ( 64 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
 5      [ GroupId ]   [ int ]   NOT   NULL  ,
 6      [ DeptId ]   [ int ]   NOT   NULL  ,
 7      [ SettingString ]   [ varchar ]  ( 200 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
 8      [ PermitString ]   [ varchar ]  ( 200 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
 9      [ LastActive ]   [ datetime ]   NULL  ,
10      [ CreateDate ]   [ datetime ]   NULL  ,
11      [ Remark ]   [ varchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
12      [ LoginCount ]   [ int ]   NULL  
13 ON   [ PRIMARY ]

3. 接下来这个步骤是根据数据库写实体类和映射文件,难度不大,但比较繁琐,还是启动CodeSmith Professional 4.1,交给他做。下载的版本中已经包含了很多模板,其中就有NHibernate,找到NHibernate.cst,右键菜单,点击Execute。
n1.bmp
在弹出的界面中配置如下:
n2.bmp

其中Database旁边有个按钮,按下之后弹出数据库配置界面,新增一个,名字随便取,这里取名ezweb,Provider type 选SqlSchemaProvider,Connect string 就是连接到数据库的连接字符串。配置结束,点击Generate,这个时候CodeSmith并不会询问你要Generate谁,数据库中的所有用户表他都Generate,感觉稍欠妥当,经过3到5秒钟之后(看表有多少了),代码和映射文件就出现在文件夹中了。这个地方有个问题,实体类名称就是表名称,而我的习惯是表名都有前缀,所以生成的实体类名称就是ez_User,看起来非常的不合胃口,java中的hibernate也有这个毛病,所以如果要使用Hibernate,设计数据表的时候起名就要注意了。更改表名称,重来一遍,得到了User实体类和User.hbm.xml映射文件。

4.启动vs2005,新建项目,模板是类库。名称,如前在CodeSmith中的名字:qs.model。
把User.cs和User.hbm.xml拷贝到项目中,添加到项目中。此时进行编译是没有问题的,但使用是有问题的,要做一些修改:
打开user.hbm.xml,找到这句<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">,注意最后的数字,如果是1.2版本的Nhibernate此处要改成2.2
<class name="qs.model.User, qs.model" table="`User`">,这个地方要写清楚程序集名称和类名称,table="'User'"是说要到哪个表中查询数据,其中还带了单引号,是加到查询语句中的,例如:select 'user' ....,所以可有可无。
打开User.cs,将所有公开属性都加virtual,变成虚的
至此准备结束,开始测试。

5.新建一个控制台项目,引入Nhibernate.dll,注意版本,要引入for .Net 2.0的,引入qs.model.dll
在main方法中写入如下代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Text;
 4
 5 using  NHibernate;
 6 using  NHibernate.Cfg;
 7 using  qs.model;
 8
 9 namespace  test
10 ExpandedBlockStart.gifContractedBlock.gif {
11    class Program
12ExpandedSubBlockStart.gifContractedSubBlock.gif    {
13        static void Main(string[] args)
14ExpandedSubBlockStart.gifContractedSubBlock.gif        {
15
16            try
17ExpandedSubBlockStart.gifContractedSubBlock.gif            {
18                Configuration config = new Configuration().AddAssembly("qs.model");
19                ISessionFactory factory = config.BuildSessionFactory();
20                ISession session = factory.OpenSession();
21
22                User u = new User();
23                u.UserName = "lordel";
24                u.GroupId = 2;
25                u.Password = "asdf";
26                u.PermitString = "sdf";
27                u.Remark = "df";
28                u.SettingString = "fd";
29                u.CreateDate = DateTime.Now;
30                u.LastActive = DateTime.Now;
31                u.LoginCount = 0;
32                u.Id = 3;
33
34                ITransaction trans = session.BeginTransaction();
35                session.Save(u);
36                trans.Commit();
37                Console.WriteLine("OK!");
38
39                Console.Read();
40            }

41            catch (Exception ex)
42ExpandedSubBlockStart.gifContractedSubBlock.gif            {
43                trans.Rollback();
44                Console.WriteLine(ex.Message);
45                Console.WriteLine(ex.StackTrace);
46            }

47            finally
48ExpandedSubBlockStart.gifContractedSubBlock.gif            {
49                Console.ReadLine();
50            }

51        }

52    }

53}

Console.ReadLin()没有特殊含义,就是Run完的时候让他停下来,要不窗口一闪而过。执行,通过。

总结:
1.Nhibernate并不会像hibernate那样生成工厂类,如果按照分层次开发,Nhibernate就充当了数据访问层,对实体的操作,可直接弄到逻辑层了。
2.顺便一下hibernate的实体层和数据访问层都在一起,而实体层往往要在各层都要用到,还是用点功夫提出来。
2.出现could not compile mapping document、could not find entity classes等错误,多半是映射文件不正确。
3.如果有could not execute sql等错误,要注意表中是否有不允许空值的字段,尤其是时间类型的。

转载于:https://www.cnblogs.com/suxvsheng/archive/2008/08/27/1277891.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值