当前位置: 代码迷 >> .NET相关 >> 老妪能解的Nhibernate教程(1) - 基本操作,映射,CURD
  详细解决方案

老妪能解的Nhibernate教程(1) - 基本操作,映射,CURD

热度:521   发布时间:2016-04-24 02:46:09.0
通俗易懂的Nhibernate教程(1) ----- 基本操作,映射,CURD

网站架构:

1.图片

image_thumb3

2.说明

Data  -----------------------   类库项目,数据访问层,由Nhibernate提供数据相关操作

Mapping -------------------    类库项目,映射文件都在这个项目中

Model   --------------------    类型项目,实体层

XShop  --------------------     Mvc项目,UI层

 

步骤:

1.安装Nhibernate

2.配置Nhibernate

3.创建实体类

4.编写映射文件

5.创建数据库/表

6.CURD操作

7.测试

 

 

第一步:安装Nhibernate,这一步就不用说了,使用Nuget安装,看图

 

image_thumb11

 

 

第二步:配置Nhibernate

2.1 这一步主要是一些系统级的配置,如:连接字符串,数据库驱动,数据库方言等

2.2 创建 hibernate.cfg.xml文件(XShop项目中)

<?xml version="1.0" encoding="utf-8" ?><hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">  <!--Nhibernate对数据库操作是基于ISession(会话),可以理解为SqlConnection的封装,可通过SessionFactory创建-->  <session-factory name="XShop">    <!--连接提供程序-->    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>        <!--连接字符串-->    <property name="connection.connection_string">      Server=.;initial catalog=XShopDb;Integrated Security=SSPI    </property>        <!--Nhibernate是一个支持多个数据库的Orm框架,然而几乎每个数据库产品都对Sql的实现都有所不同-->    <!--Nhibernate通过dialect(方言)消除数据库之间的差异-->    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>        <!--是否在调试的时候打印Sql语句-->    <property name="show_sql">true</property>        <!--映射文件所在的程序集-->    <mapping assembly="Mapping"/>  </session-factory></hibernate-configuration>

温馨提示:如果发现在编写xml文件的时候发现没有智能提示,请把Nhibernate包的xsd文件复制到Vs安装目录中(参考百度)

注意:Nhibernate配置文件的文件名必须为 hibernate.cfg.xml ,不可随意更改

 

第三步:创建实体类 Customer(Model项目)

3.1 代码

namespace Model{    public class Customer    {        public virtual int Id { get; set; }        public virtual string Name { get; set; }        public virtual string UserName { get; set; }        public virtual string Password { get; set; }        public virtual DateTime CreateTime { get; set; }    }}

注意:实体类的属性必须是virtual,否则Nhibernate会报错.why?因为这样Nhibernate就可以重写这些属性的访问逻辑,比如 延迟加载..

 

第四步:创建 Customer.hbm.xml 映射文件(Mapping项目)

4.1 代码:

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" auto-import="true" default-cascade="all" default-lazy="true" namespace="Model">  <!--<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="实体类所在的程序集" auto-import="是否自动导入命名空间,如果否,下面类名应该写类的全名"  default-cascade="默认的级联操作" default-lazy="是否延迟加载" namespace="实体类所在的命名空间">-->    <!--<class name="类型名/类型全名" table="对应的表名" >-->  <class name="Customer" table="Customer" >        <!--id是必须的-->    <!--<id name="Id的属性名" column="列名" type="数据类型" unsaved-value="未被持久化到数据库时,id的值" generator="id的生成策略"></id>-->    <id name="Id" column="CustomerId" type="int" unsaved-value="0" generator="native"></id>        <!--<property name="属性名" column="对应的列名" length="长度" type="数据类型" not-null="是否不可空"></property>-->    <property name="Name" column="Name" length="20" type="string" not-null="true"></property>    <property name="UserName">      <column  name="UserName" sql-type="nvarchar" not-null="true" length="20"></column>    </property>        <property name="Password" length="32" column="Password" not-null="true" type="string"></property>    <property name="CreateTime" column="CreateTime" type="datetime" not-null="true"></property>  </class></hibernate-mapping>

注意:

1.映射文件命名规则:  类名.hbm.xml  ,不可随意更改

2.映射文件的生成策略必须为:嵌入到程序集

 

第五步:创建数据库和表

5.1 创建数据库

CREATE DATABASE XShopDbGO

 

5.2  创建表

   5.2.1创建表的两种方式--手动创建

    注意:创建的表结构应该与映射文件一样

    5.2.1创建表的两种方式--使用SchemaExport生成的Sql

    代码:可以创建一个控制台项目或Winform项目跑下面这段代码

NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration().Configure();NHibernate.Tool.hbm2ddl.SchemaExport schemaExport = new NHibernate.Tool.hbm2ddl.SchemaExport(configuration);//打印Sql脚本,但不执行 schemaExport.Create(true, false); //导出到文件//schemaExport.SetOutputFile(@"c:/schma.sql");

       结果:

        image_thumb5

 

 

第六步:CURD操作(Data项目)

6.1 上面我们提过,所有数据库操作都是通过ISession对象操作,而ISession可以通过ISessionFactory创建

-----创建HbmHelper类--获取ISessionFactory

namespace Data{    public class HbmHelper    {        private static ISessionFactory _sessionFactory;        public static ISessionFactory CurrentSessionFactory        {            get            {                if (_sessionFactory == null)                {                    //创建SessionFactory                    _sessionFactory = new Configuration().Configure().BuildSessionFactory();                 }                return _sessionFactory;            }        }    }}

 

-------从ISessionFactory中创建session

private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();

 

------添加数据访问基类 BaseDal<T>

namespace Data{    /// <summary>    /// 数据访问基类    /// </summary>    /// <typeparam name="T"></typeparam>    public class BaseDal<T> where T : class    {        //从ISessionFactory中创建session        private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();        #region ------------------   CURD    ----------------        /// <summary>        /// 添加数据        /// </summary>        /// <param name="model"></param>        public int Insert(T model)        {           int id=(int) _session.Save(model);            _session.Flush();            return id;        }        /// <summary>        /// 更新        /// </summary>        /// <param name="model"></param>        public void Update(T model)        {            //使用事务            using (ITransaction ts = _session.BeginTransaction())            {                try                {                    _session.Update(model);                    _session.Flush();                    ts.Commit();                }                catch (Exception)                {                    ts.Rollback();                    throw;                }            }        }        /// <summary>        /// 删除        /// </summary>        /// <param name="model"></param>        public void Delete(T model)        {            _session.Delete(model);            _session.Flush();        }        /// <summary>        /// 查询        /// </summary>        /// <param name="id"></param>        /// <returns></returns>        public T Query(int id)        {            return _session.Get<T>(id);        }                #endregion    }}

 

第七步:添加数据,测试

7.1 添加数据

image_thumb1

7.2 创建单元测试项目,添加测试类:

namespace DataTest{    [TestClass]    public class BaseDalTest    {        private BaseDal<Customer> _customerDal = new BaseDal<Customer>();        [TestMethod]        public void GetTest()        {            var result = _customerDal.Query(1);            Assert.AreEqual(result.Name, "张小军");        }        [TestMethod]        public void InsertTest()        {            Customer customer = new Customer()            {                Name = "张三",                Password = "654321",                UserName = "zhs"            };            int id = _customerDal.Insert(customer);            var result = _customerDal.Query(id);            Assert.AreEqual(customer.UserName, result.UserName);        }        [TestMethod]        public void UpdateTest()        {            var result = _customerDal.Query(1);            result.Name = "王五";            _customerDal.Update(result);            var r2 = _customerDal.Query(1);            Assert.AreEqual(result.Name,r2.Name);        }        [TestMethod]        public void DelTest()        {            var result = _customerDal.Query(1);            _customerDal.Delete(result);            var r2 = _customerDal.Query(1);            Assert.IsNotNull(r2);        }    }}

 

代码:http://files.cnblogs.com/files/zhxj/XShop0822.zip

原创文章,转载请注明出处:http://www.cnblogs.com/zhxj/      

 

 

2015.08.22 --张小军

3楼Moon.Orm塑造Orm经典
说真的,建议楼主不要学这个,没有必要.实体框架都好得多.至少推荐学习的指数高得多.,你看看有几个人受得了这配置..................,然后你看看下面我给你的orm的使用对比.
Re: 张小军
@Moon.Orm塑造Orm经典,公司项目需要,新版本的Nhibernate不需要写映射文件,但是我觉得,现阶段,先从配置xml学起
2楼Moon.Orm塑造Orm经典
Re: 张小军
@Moon.Orm塑造Orm经典,不错,有空可以研究一下
1楼Moon.Orm塑造Orm经典
http://www.cnblogs.com/humble/p/4593133.html
  相关解决方案