丹尼大叔

数学专业毕业,爱上编程的大叔,兴趣广泛。使用博客园这个平台分享我工作和业余的学习内容,以编程交友。有朋自远方来,不亦乐乎。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

摘要

这篇文章介绍了如何创建一个简单的使用NHibernate的控制台应用程序,包括使用NuGet、简单的配置、单表映射、对NHibernate配置文件添加智能提示、使用ISessionFactory和ISession。

1. 环境准备

Visual Studio 2015、SQL Server 2008或者SQL Server 2008 R2。

2. 创建工程

1)创建空控制台应用程序NHibernateDemoApp。

2)添加NHibernate到工程。右键NHibernateDemoApp工程,选择"Manage NuGet Packages..."。

3)在打开的"NuGet Packages Manager"上选择"Browse",输入"NHibernate",查出最新的NHibernate版本,选择版本4.0.0.4000,点击"Install"。

 在弹出的对话框里选择"OK"。看到将安装NHibernate.4.0.4.4000和Iesi.Collections.4.0.0.4000。

安装完成后,在Output里出现这个Successfully的结果。

再来看NHibernateDemoApp的Reference。已经添加了NHibernate和Iesi.Collections进来。

也可以到NHibernate官网去下载最新的版本。下载地址NHibernate

3. 创建SQL Server数据库NHibernateDemoDB

创建表Customer

设置Id为主键,设置Id列的Identity属性。

4. 创建Customer类

 1 using System;
 2 
 3 namespace NHibernateDemoApp
 4 {
 5     public class Customer
 6     {
 7         public virtual int Id { get; set; }
 8         public virtual string FirstName { get; set; }
 9         public virtual string LastName { get; set; }
10         public virtual double AverageRating { get; set; }
11         public virtual int Points { get; set; }
12         public virtual bool HasGoldStatus { get; set; }
13         public virtual DateTime MemberSince { get; set; }
14         public virtual CustomerCreditRating CreditRating { get; set; }
15         public virtual string Street { get; set; }
16         public virtual string City { get; set; }
17         public virtual string Province { get; set; }
18         public virtual string Country { get; set; }
19     }
20 
21     public enum CustomerCreditRating
22     {
23         Excellent, VeryVeryGood, VeryGood, Good, Neutral, Poor, Terrible
24     }
25 }

注意:

  • 所有属性都为virtual,为了支持Lazy Loading。
  • 所有属性的访问属性都为Public,不然NHibernate找不到该属性。
  • 类属性是Public,不然NHibernate找不到该类。

5. 创建Customer.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDemoApp" namespace="NHibernateDemoApp">
  <class name="Customer" table="Customer">
    <id name="Id">
      <generator class="native"/>
    </id>
    <property name="FirstName" not-null="true"/>
    <property name="LastName" not-null="true"/>
    <property name="AverageRating"/>
    <property name="Points"/>
    <property name="HasGoldStatus"/>
    <property name="MemberSince" />
    <property name="CreditRating" type="CustomerCreditRating"/>
    <property name="Street"/>
    <property name="City"/>
    <property name="Province"/>
    <property name="Country"/>
  </class>
</hibernate-mapping>
  • 注意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结尾

6. 修改Customer.hbm.xml文件属性

  • Build Action: Embedded Resource
  • Copy to Output Directory: Copy always
  • 如果不设置这两个属性,后面执行的时候会出错

7. 为NHibernate工程的xml配置文件添加智能提示

点击工具栏上的XML->Schma,打开"XML Schemas"窗口。

点击"Add",选择"nhibernate-configuration.xsd"和"nhibernate-mapping.xsd"两文件。这两文件存在于当前工程下的"$\packages\NHibernate.4.0.4.4000"文件夹下。选择后点"OK"。

 加入之后,再编辑Customer.hbm.xml文件会出现智能提示。

有时候重启Visual Studio后,智能提示都会消失了,要重新加载这两个文件。

8. 修改Program类

 1 using NHibernate.Cfg;
 2 using NHibernate.Dialect;
 3 using NHibernate.Driver;
 4 using System;
 5 using System.Reflection;
 6 
 7 namespace NHibernateDemoApp
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             var cfg = new Configuration();
14 
15             cfg.DataBaseIntegration(x =>
16             {
17                 x.ConnectionString = "Data Source=localhost;Initial Catalog=NHibernateDemoDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
18                 x.Driver<SqlClientDriver>();
19                 x.Dialect<MsSql2008Dialect>();
20             });
21             cfg.AddAssembly(Assembly.GetExecutingAssembly());
22             var sefact = cfg.BuildSessionFactory();
23             using (var session = sefact.OpenSession())
24             {
25                 using (var tx = session.BeginTransaction())
26                 {
27                     //perform database logic 
28                     tx.Commit();
29                     Console.WriteLine("Well Done");
30                 }
31                 Console.ReadLine();
32             }
33         }
34     }
35 }
  • Configuration类对象相当于ADO.Net的Connection对象,但是他包含更丰富的配置信息。
  • 调用cfg.DataBaseIntegration方法进行配置,这里配置了:数据库连接字符串、使用连接的Driver类SqlClientDriver和使用Dialect类MsSql2008Dialect
  • cfg.AddAssembly(Assembly.GetExecutingAssembly());是告诉NHibernate去哪里找xml映射文件信息。这里是从正在执行的assembly中查找
  • SessionFactory和Session是NHibernate的基础类,SessionFactory编译所有的元数据,产生Session。Session封装了所有的NHibernate方法

9. 执行程序,得到运行结果

 到此为止,我们setup了一个简单的NHibernate环境,包括安装NHibernate,加入智能提示,添加映射文件。

下一节介绍简单的NHibernate查询,添加,修改,删除操作。

 

posted on 2016-07-02 09:53  丹尼大叔  阅读(1345)  评论(2编辑  收藏  举报