C#——Nhibernate探索

 C#—Nhibernate探索

从零开始在.net中使用Nhibernate对数据库进行操作详细步骤

本篇文章,让我们一起来探索Nhibernate。

从学习NhibernateERP中,还得知不单只ADO.NET能是实现对数据库表进行操作,还有Nhibernate、Linq、EntityFramwork这些技术。算我孤陋寡闻吧。

首先我们去搜索Nhibernate下载地址,如下链接所示。

刚学完Nhibernate,也折腾了一天才搞好,就拿出来跟大家分享一下吧。

该版本可能是最新版,我下载的4.0.4.GA。其中GA意思我没搞清楚。不过应该不重要。

首先我们必须知道的是,NhibernateERP是ORM框架,所谓ORM就是Object
Relational Mapping,是一种将关系型数据库中的数据与面向对象语言中对象建立映射关联的技术。

图片 1

分析文件内容

用Nhibernate的好处是什么呢?使用Nhibernate操作数据库,我们可以像操作对象一样操作数据库,Nhibernate将我们对对象的变更保存到数据库中去,还负责以对象的方式从数据库中查询数据,好处就是可以使开发人员从处理数据库这里节省时间和精力用于处理业务逻辑。

下载完成后,解压缩,我们看到文件夹内容如下图所示。

我们使用的Nhibernate框架,可以再官网上找到,www.nhibernate.org
或者csdn找咯。我这里用的版本是2.1.2.GA 。

 图片 2

一、Nhibernate目录下的内容

我们可以分析得出,其中Required_Bins存储的是类库和其他资源;字面的意思Required,是必须文件。

图片 3

打开Required文件夹,我们看到里面是这样的。

1、Configuration_Templates:存放Nhibernate连接数据库的配置文件的示例

图片 4

图片 5

这里有两个类库;可以分析得出,这两个类库是要被引用的。

根据实制所用的数据库选择示例中的代码并更改其中的数据源即可。

类库拥有对应的XML,没找到具体使用该XML的方法。所以暂时不去理他。

2、Required_Bins:存放Nhibernate运行过程中所需要的类库文件(dll)

NHibernate.pdb应该是没有用的。估计是作者忘记删除了。

图片 6

nhibernate-configuration.xsd和nhibernate-mapping.xsd两个文件暂时不知道要干什么用的。

其中还包含第三方的开源日志框架Log4Net,这个框架主要用于记录程序日志信息。()

但看到.xsd文件,第一时间反应,他们应该是用来帮助开发者,快速生成配置文件用的。为了保险起见,我们上网查询一下。

3、Required_For_LazyLoading:存放延时加载特性支持所需的框架文件,在这个文件夹下提供了三种实现,选择其中一种将其所有的dll文件引用到项目中去。在本实例中选择了Castle

查询结果:

Castel的核心是个轻量级容器,实现了IoC模式的容器,基于此核心容器所建立的应用程序,可以达到程序组件的松散耦合,让程序组件可以进行测试,这些特性都使得整个应用程序可以再架构上与维护上都能得到相当程度的简化。(来自百度

查询结果是,他们俩是【文件智能提示功能】用的。

4、Tests:存放测试试用文件,在此文件夹下有一个名为ABC.bhm.xml的文件,这个是数据表对应配置文件的示例。

且nhibernate-configuration.xsd和nhibernate-mapping.xsd是要放到c盘的,路径如下:

二、开始创建第一个程序测试和配置

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas

1、 首先在数据库创建我们的表,表结构如下:

因为是我用的是vs2012,所以,我找的路径是Microsoft Visual Studio
11.0。并将文件放在了那里面。

我们先创建一个名为ERP的数据库,建表,表名:Person

虽然感觉,这俩文件好像不是这么用的,但由于可以判断它们并不影响程序运行,所以,先且不管他们,等程序运行起来后,再删除他们试试。

图片 7

 

把如下语句在数据库执行就好了:

再之后,我上网调查了下Nhibernate的应用。

图片 8图片 9View Code

上网调查后,发现Nhibernate有Castle框架、LinFu框架、Spring.Net三种。

USE [ERP]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[Person](

[ID] [int] IDENTITY(1,1) NOT NULL,

[UserID] [int] NULL,

[UserName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

[BirtherDate] [datetime] NULL,

[Height] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

[Sex] [int] NULL,

CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED

(

[ID] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

看起来很复杂,文章有很多,写的又很复杂,于是我放弃调查,直接尝试使用,首先第一步,直接引用类库。

 

 

三、创建一个解决方案命名为NHIbernateERP

一、建立了一个类库程序,引用Iesi.Collections.dll和NHibernate.dll两个DLL。 

图片 10

接下来,我们开始建立持久化对象。

1、在解决方案添加三个项目,分别为DAL,DomainModel,WebApp

public class Test 
 { 
        public virtual int Id { get; set; } 
        public virtual string Name { get; set; } 
}

1)
在项目DomainModel中分别见两个目录,Entities和Mappings从大意上我们可以知道,

接下来建立持久化对象与数据库的映射。再次上网调查。

Entities是放实体类的(持久化类),Mapping是放映射对象。

调查结果:

持久化类:是指其实例需要被Hibernate持久化到数据库中的类。持久化类包含一些属性,有get和set,且属性名的首字母为大写。

对象与数据库的映射是保存在XML文件中的,于是我配置XML映射文件如下。

图片 11

该XML文件的属性,要求设置其生成操作为【嵌入的资源】。

首先我们把Iesi.Collections文件引用进来。

但我怕它丢失,还给他设置了始终复制的属性。

Lesi.Collection类库作用相当于现在的Linq,提供集合运算功能,且支持泛型。这里我们使用它
在两个集合里取相同部分的功能。

XML文件如下:

2)、【Entities】下建立Person类

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
   assembly="NherbinateHelper"
   namespace="NherbinateHelper">
  <class name ="Test">
    <id name="Id" column ="Id">
      <generator class ="native"/>
    </id>
    <property name ="Name"/>
  </class>
</hibernate-mapping>

代码如下,我们只要求包含get和set,属性的首字母要大写

再然后,我需要建立数据库连接的类。

图片 12图片 13View Code

再次上网调查。编写NHibernateHelper如下。

public class Person

{

public virtual int ID { get; set; }

public virtual int UserID { get; set; }

public virtual string UserName { get; set; }

public virtual DateTime BirtherDate { get; set; }

public virtual float Height { get; set; }

public virtual bool Sex { get; set; }

}
 public class NHibernateHelper
    {
        private ISessionFactory _sessionFactory;
        public NHibernateHelper()
        {
            _sessionFactory = GetSessionFactory();
        }
        private ISessionFactory GetSessionFactory()
        {
            return (new Configuration()).Configure().BuildSessionFactory();
        }
        public ISession GetSession()
        {
            return _sessionFactory.OpenSession();
        }
}

 

因为我们没有显示设置数据库连接字符串,所以,如果程序可以运行,那么这个类,一定会读配置文件中SQL字符串连接。

3)、【Mappings】下建立映射文件Person.hbm.xml,注意Person是对应上面实体类的名称,必须以.hbm.xml为后缀名。我们可以参照Nhibernate包里面的实例Tests文件夹里面的ABC.hbm.xml。如果想在编写时候有智能提示的,可以把【Required_Bins】目录下的

然后,我们建立domain(域),添加对Text持久化对象的增删改查的方法。

图片 14

public class NHibernateSample
    {
        protected ISession Session { get; set; }
        public NHibernateSample(ISession session)
        {
            Session = session;
        }
        public void CreateCustomer(Test test)
        {
            Session.Save(test);
            Session.Flush();
        }
        public Test GetCustomerById(int Id)
        {
            return Session.Get<Test>(Id);
        }
    }

[Nhibernate-configuration.xsd]和[nhibernate-mapping.xsd]两个文件拷贝到VS
的安装目录/Microsoft Visual Studio
10.0/Xml/Schemas下,就可以有智能提示了。

再然后,我们新建一个控制台程序,用于测试我们编写的这个NHibernate,是否可以正常运行。

图片 15图片 16View Code

编写测试类代码如下。

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel">

<class name="DomainModel.Entities.Person,DomainModel" table="Person">

//name=类的全名,命名空间 table=表名

<id name="ID" column="ID">

<generator class="native" />

</id>

<property name="UserID" column="UserID" />

// name=属性名 cloumn=字段名称

<property name="UserName" column="UserName" />

<property name="BirtherDate" column="BirtherDate" />

<property name="Height" column="Height" />

<property name="Sex" column="Sex" />

</class>

</hibernate-mapping>
public class NHibernateSampleFixture
{
        private NHibernateSample _sample;
        public NHibernateSampleFixture()
        {
            _sample = new NHibernateSample(new  NHibernateHelper().GetSession());
        }
        public void GetCustomerByIdTest()
        {
            var tempCutomer = new Test {  Name = "李" };
            _sample.CreateCustomer(tempCutomer);
            Test customer = _sample.GetCustomerById(1);
            int customerId = customer.Id;
        }
}

 

main函数调用如下:

注意,属性名必须跟实体类的属性名相同,注意大小写,字段名必须对应Person表的字段,注意大小写。

class Program 
    { 
        static void Main(string[] args) 
        { 
            NHibernateSampleFixture f = new NHibernateSampleFixture(); 
            f.GetCustomerByIdTest(); 
        } 
}

在配置完这个文件以后,要注意关键的一步,把【Person.hbm.xml】文件的属性

测试结果是失败,因为,我们还没有在任何地方设置数据库连接字符串。所以推断,缺少了配置数据库连接的文件。

复制到输出目录:始终复制

接着,我打开文件夹了Configuration_Templates。

生成操作:嵌入的资源

发现Configuration_Templates文件夹下有如下文件。

图片 17

发表评论

电子邮件地址不会被公开。 必填项已用*标注