NHibernate入门

 

由于新公司用的是NHibernate数据库ORM, 所以也是在学习中,以前用Entity Framework,所以希望一步一步的学习。

要了解一个新技术,最经典的是从Hellow World!开始。

我们要完成的任务:

  • 一、使用Visual Studio 2015 建立一个控制台项目
  • 二、使用NuGet安装NHibernate
  • 三、下载NHibernate(上面用Nuget安装了,为什么还要下载呢?因为下载包里有个文件要用到,给VS智能感知用的,在做表配置映射的时候会智能提示)
  • 四、添加一个本地数据库文件,用以建测试数据库用
  • 五、配置NHibernate,包括:
  • 六、编写代码,读取数据库记录
  • 七、对数据的CRUD操作。
  • 八、数据库改为MySQL,目前公司在用MySQL

下面我们就一步一步安装上面的步骤完成任务


一、新建控制台项目:NHFirstDemo

二、使用NuGet安装NHibernate

安装完成后的类库引用多了2个项,其他没有变。(多个packages.config,Nuget配置文件)

三、下载NHibernate(上面用Nuget安装了,为什么还要下载呢?因为下载包里有个文件要用到,给VS智能感知用的,在做表配置映射的时候会智能提示)

现在地址:http://nhibernate.info/ 

安装包如下:

解压后,里面很多文件

其中Required_Bins 包括我们需要的文件

四、添加一个本地数据库文件 DemoDB,用以建测试数据库用

 创建表User,3个字段,id主键,标识,不为空。Name50个字符串可空,Age 整形,可空,建议规范命名,首字母大写,字符串用nvarchar 类型不会有乱码出现

 随便插入几条测试数据:

 五、配置NHibernate,包括:

创建映射文件,一个实体一个文件,User.hbm.xml,双击打开该文件,然后在空白处右击选择属性导入智能提示文件

 看看,有智能提示了

User.hbm.xml 文件内容:

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="NHFirstDemo" namespace="NHFirstDemo.NHFirstDemo">
  <class name="User">
    <id name="Id" generator="hilo" />
    
    <property name="Name" />
    <property name="Age" />

  </class>
</hibernate-mapping>
复制代码

再新加一个实体类(POCO)文件 User.cs

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NHFirstDemo
{
    public class User
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual int Age { get; set; }
    }
}
复制代码

=====================================================================================================

换一个类来做示例 

Customer.cs

对应的映射文件 Customer.hbm.xml

  • 注意hibernate-mapping的assembly、namespace属性要填写正确
  • class的name属性表示类名,table是映射的表名,如果类名称和表名称相同,可以省略table属性
  • property的name属性是类的属性名,如果类属性名和表的列名相同,可以省略column属性
  • property的type属性表示.net类属性映射的NHibernate数据类型。如果是int、bool、double这样的.net基础数据类型,则可以省略
  • property的type属性如果是DateTime、string,也可以省略
  • property的not-null属性对应关系表的列的nullable属性,默认值是false。因此,如果允许为空,则可以省略
  • id表示主键,name为主键名,<generator class="native"/>表示数据表的主键按简单Identity的自增算法生成新记录主键值(NHibernate提供了多种主键值生成算法,这里只用最简单的Identity算法)
  • 文件名必须以.hbm.xml结尾 

  

连接配置数据库

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Threading.Tasks;
 
using  NHibernate.Cfg;
using  NHibernate.Dialect;
using  NHibernate.Driver;
using  System.Reflection;
 
namespace  NHibernateDemoApp
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             var  cfg = new  Configuration(); //Configuration类对象相当于ADO.Net的Connection对象,但是他包含更丰富的配置信息。
 
             //调用cfg.DataBaseIntegration方法进行配置,这里配置了:数据库连接字符串、使用连接的Driver类SqlClientDriver和使用Dialect类MsSql2008Dialect
             cfg.DataBaseIntegration(x =>
             {
                 x.ConnectionString = "Data Source=localhost;Initial Catalog=NHibernateDemoDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" ;
                 x.Driver<SqlClientDriver>();
                 x.Dialect<MsSql2008Dialect>();
             });
 
             cfg.AddAssembly(Assembly.GetExecutingAssembly()); //告诉NHibernate去哪里找xml映射文件信息
             var  sefact = cfg.BuildSessionFactory(); //SessionFactory和Session是NHibernate的基础类,SessionFactory编译所有的元数据,产生Session。Session封装了所有的NHibernate方法
             using  ( var  session = sefact.OpenSession())
             {
                 using  ( var  tx = session.BeginTransaction())
                 {
                     //
                     tx.Commit();
                     Console.WriteLine( "Well Done" );
                 }
                 Console.ReadLine();
             }
         }
     }
}

改进上面的操作方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Threading.Tasks;
 
using  NHibernate.Cfg;
using  NHibernate.Dialect;
using  NHibernate.Driver;
using  System.Reflection;
using  NHibernate;
 
namespace  NHibernateDemoApp
{
     class  Program
     {
         private  static  ISessionFactory _sessionFactory;
 
         public  static  ISessionFactory SessionFactory
         {
             get
             {
                 //SessionFactory的创建很占用系统资源,一般在整个应用程序中只创建一次。因此,这里通过判断if (_sessionFactory == null)实现一个最简单的单例模式。
                 if  (_sessionFactory ==  null )
                 {
                     var  cfg =  new  Configuration();
                     cfg.DataBaseIntegration(x =>
                     {
                         x.ConnectionString =  "Data Source=localhost;Initial Catalog=NHibernateDemoDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" ;
                         x.Driver<SqlClientDriver>();
                         x.Dialect<MsSql2008Dialect>();
                     });
                     cfg.AddAssembly(Assembly.GetExecutingAssembly());
                     _sessionFactory = cfg.BuildSessionFactory();
                 }
                 return  _sessionFactory;
             }
         }
 
         private  static  IList<Customer> GetAll()
         {
             using  ( var  session = SessionFactory.OpenSession())
             {
                 IList<Customer> list = session.CreateCriteria<Customer>().List<Customer>();
                 return  list;
             }
         }
 
         private  static  Customer GetById( int  id)
         {
             using  ( var  session = SessionFactory.OpenSession())
             {
                 Customer customer = session.Get<Customer>(id);
                 return  customer;
             }
         }
 
         /// <summary>
         /// 新增客户
         /// </summary>
         /// <param name="customer">客户对象</param>
         /// <returns>插入后的客户ID</returns>
         private  static  int  Insert(Customer customer)
         {
             using  ( var  session = SessionFactory.OpenSession())
             {
                 var  identifier = session.Save(customer); //插入新记录,返回新纪录主键值
                 session.Flush(); //增删改操作完成之后需要调用session.Flush()方法,将对象持久化写入数据库。如果不调用此方法,方法结束后修改记录不能写入到数据库
                 return  Convert.ToInt32(identifier);
             }
         }
 
         private  static  void  Update(Customer customer)
         {
             using  ( var  session = SessionFactory.OpenSession())
             {
                 session.SaveOrUpdate(customer); //如果被调用的Customer对象在数据库里不存在(新记录),则插入新记录,否则修改该记录
                 session.Flush();
             }
         }
 
         private  static  void  Delete( int  id)
         {
             using  ( var  session = SessionFactory.OpenSession())
             {
                 var  customer = session.Load<Customer>(id);
                 session.Delete(customer); //传入Customer对象进行删除
                 session.Flush();
             }
         }
         static  void  Main( string [] args)
         {
             #region 原始链接数据库方法
             /*
             var cfg = new Configuration();//Configuration类对象相当于ADO.Net的Connection对象,但是他包含更丰富的配置信息。
 
             //调用cfg.DataBaseIntegration方法进行配置,这里配置了:数据库连接字符串、使用连接的Driver类SqlClientDriver和使用Dialect类MsSql2008Dialect
             cfg.DataBaseIntegration(x =>
             {
                 x.ConnectionString = "Data Source=localhost;Initial Catalog=NHibernateDemoDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
                 x.Driver<SqlClientDriver>();
                 x.Dialect<MsSql2008Dialect>();
             });
 
             cfg.AddAssembly(Assembly.GetExecutingAssembly());//告诉NHibernate去哪里找xml映射文件信息
             var sefact = cfg.BuildSessionFactory();//SessionFactory和Session是NHibernate的基础类,SessionFactory编译所有的元数据,产生Session。Session封装了所有的NHibernate方法
             using (var session = sefact.OpenSession())
             {
                 using (var tx = session.BeginTransaction())
                 {
                     //
                     tx.Commit();
                     Console.WriteLine("Well Done");
                 }
                 Console.ReadLine();
             }
             */
             #endregion
 
 
             Customer newCustomer = CreateCustomer();
             int  customerId = Insert(newCustomer);
             Console.WriteLine( "新客户ID:{0}" , customerId);
 
             IList<Customer> list = GetAll();
             Console.WriteLine( "客户列表数量:{0}" , list.Count);
             foreach  ( var  item  in  list)
             {
                 Console.WriteLine( "{0} {1}" , item.FirstName, item.LastName);
             }
 
             var  customer = GetById(customerId);
             Console.WriteLine( "GetById: {0} {1}" , customer.FirstName, customer.LastName);
 
             customer.LastName =  "Chen" ;
             Update(customer);
             var  updatedCustomer = GetById(customerId);
             Console.WriteLine( "updated: {0} {1}" , updatedCustomer.FirstName, updatedCustomer.LastName);
 
             Delete(customerId);
             var  existedCustomer = GetById(customerId);
             Console.WriteLine( "after deleted: existing: {0}" , existedCustomer !=  null );
 
             Console.ReadLine();
 
         }
 
         //示例数据
         private  static  Customer CreateCustomer()
         {
             var  customer =  new  Customer
             {
                 FirstName =  "Daniel" ,
                 LastName =  "Tang" ,
                 Points = 100,
                 HasGoldStatus =  true ,
                 MemberSince =  new  DateTime(2012, 1, 1),
                 CreditRating = CustomerCreditRating.Good,
                 AverageRating = 42.42424242,
                 Street =  "123 Somewhere Avenue" ,
                 City =  "Nowhere" ,
                 Province =  "Alberta" ,
                 Country =  "Canada"
             };
             return  customer;
         }
 
 
 
     }
}

  

转载于:https://www.cnblogs.com/LiChen19951127/p/9963641.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值