.Net——Nhibernate实现CRUD

               最近用到SSH(spring+struct+hibernate),从java里面的hibernate,不自觉联系到.net里面的Nhibernate。

        下面来简单聊下Nhibernate.

    一,引入Dll

   

           主要有三个:

        

        基本的就这三个,其他的,比如Castle.Core.dll,Castle.DynamicProxy2.dll,Iesi.Collections.dll,log4net.dll

 就用到了再引入吧。

    二,编写Nhibernate配置文件

                      

<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.dll provider for SQL Server -->
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <!--表明一些配置是针对session-factory配置的,sessionfactory是hibernate中的一个类,这个类主要负责保存hibernate的配置信息,以及对session的操作-->
  <session-factory>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property><!--配置数据库的驱动程序,hibernate在连接数据库时,需要用到数据库的驱动程序-->
    <property name="connection.connection_string">server=ZB-LIUHCH-PC\SQLEXPRESS;database=TestMemcached;uid=sa;pwd=123456;</property>
      <!--Server=ZB-LIUHCH-PC\SQLEXPRESS;UserID=sa;Database=TestMemcached;Password=123456;-->
    <property name="adonet.batch_size">10</property>
    <property name="show_sql">true</property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <!--<property name="use_outer_join">true</property>-->
    <property name="command_timeout">10</property>
    <property name="hbm2ddl.auto">update</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <mapping assembly="NhibernateTest"/>
  </session-factory>
</hibernate-configuration>

   PS:文件属性为始终复制到输出路径;

三,编写实体类及其配置文件

    实体类:

 

namespace NhibernateTest
{
   public class User
    {
        public virtual string UserCode { get; set; }
        public virtual string UserName { get; set; }
        public virtual string UserAge { get; set; }
    }
}

   配置文件:

 

<?xml version="1.0" encoding="utf-8" ?>
<!--assembly:程序集,namespace:命名空间-->
<hibernate-mapping  xmlns="urn:nhibernate-mapping-2.2" assembly="NhibernateTest"  namespace="NhibernateTest">
  <class name="NhibernateTest.User,NhibernateTest" table="User">
    <!--主键-->
    <id name="UserCode" type="string" unsaved-value="null">
      <column name="UserCode" sql-type="nvarchar" not-null="true" unique="true"/>
      <generator class="assigned"></generator>
    </id>
    <property name="UserName" type="String">
      <column name="UserName" sql-type="nvarchar"  not-null="false"/>
    </property>
    <property name="UserAge" type="String">
      <column name="UserAge" sql-type="nvarchar"  not-null="false"/>
    </property>

  </class>
</hibernate-mapping>

四,测试代码

       为了方便操作使用nhibernate,最好编写一个工具类:

         

 public class NHibernateHelper
        {
            private ISessionFactory _sessionFactory;
            public NHibernateHelper()
            {
                //创建ISessionFactory
                _sessionFactory = GetSessionFactory();
            }
            /// <summary>
            /// 创建ISessionFactory
            /// </summary>
            /// <returns></returns>
            public ISessionFactory GetSessionFactory()
            {
                //配置ISessionFactory
                return (new Configuration()).Configure().BuildSessionFactory();
            }
            /// <summary>
            /// 打开ISession
            /// </summary>
            /// <returns></returns>
            public ISession GetSession()
            {
                return _sessionFactory.OpenSession();
            }
        }

            之后我们写四段代码来简单看看CRUD操作:

          

  static void Main(string[] args)
        {
            Configuration configuration = new Configuration().Configure("hibernate.cfg.xml");  //nhibernate的配置文件的路径
            ISessionFactory sessionFactory = configuration.BuildSessionFactory();
            ISession isession = sessionFactory.OpenSession();

            #region 添加用户
                User user = new User() {
                    UserName="漠漠水田飞白鹭",
                    UserAge="789",
                    UserCode="momoshuitianfeibailu"
                };
                isession.Save(user);
                //isession.Flush();
                //isession.Close();

            #endregion

            #region 读取用户信息
                User MyUser = isession.Get<User>("momoshuitianfeibailu");
            #endregion

            #region 更新用户信息
                MyUser.UserAge="00000000";
                isession.Update("momoshuitianfeibailu", MyUser);
            #endregion

            #region 删除数据
                isession.Delete(MyUser);
                isession.Flush();
                isession.Close();

            #endregion
        }

             整个项目结构:

              

 

           小结:

                 以前在配置spring的时候就有这种感觉,感觉java平台下面的配置文件和。net平台下的配置文件配置起来大致是雷同的,还是蛮有意思的。

                 另一方面,与之前使用过的EF相比,EF因为有三种开发模式,code first,DB first, Model First,选择性比较大,如果我不想配置那么多文件,完全可以直接db first,之后各种东西就生成了,我直接用一个上下文参数就可以操作数据库。而Nhibernate的配置文件则要手写,万一我一手抖,写错一个字母,debug就耗费好多时间。

                 但是Nhibernate感觉比EF轻量一点儿,而且Nhibernate的透明持久化,这个特性挺有意思的,与EF相比,可以说它是基于Session的,不是长连接。

                     个人感觉就这么多啦。。

            

                               

时间: 2024-11-27 18:07:48

.Net——Nhibernate实现CRUD的相关文章

ADO.NET与ORM的比较(2) NHibernate实现CRUD

说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是 Spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操 作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具来操作数据. 在.NET中操作数据库的方式有多种,除了最直接的方式就是使用ADO.NET之外, 还可以使用NHibernate这个Hibernate在.NET中的实现ORM,如果你对第三方的 ORM持怀疑态度,你还可以使用来自微软的实现.根正苗红的Linq

新手求助关于CRUD实体中CRUD操作的分层问题

问题描述 简单的3层框架引用关系从上到下是UI-BLL-DAL-ENTITY,在C#编译时是从下到上编译的问题是,现在我做个小项目,将基本的CRUD做了个BLLBASE的基类放在BLL层里,然后由BLLBASE操作在DAL层中的DALBASE中的STAITIC方法,用HIBERNATE操作数据库.我本来的想法是用实体层全部继承BLLBASE方法------------------------BLLBASE部分代码------------------------------publicabstra

智能客户端-使用 NHibernate 和 Rhino 服务总线构建分布式应用程序

有很长一段时间,我的工作内容几乎都是 Web 应用程序.当我要构建一个智能客户端应用 程序时,起初我觉得非常困惑,不知该如何构建这样的应用程序.怎么处理数据访问?智能客 户端应用程序与服务器之间如何通信? 而且,我那时已经投入很多,拥有一些能够显著减少开发时间和成本的工具,而我真的希望 可以继续使用这些工具.我花了一段时间来深入考虑各种细节问题,在这期间,我一直在想如 何让 Web 应用程序更简单些呢,当然我需要先知道如何处理这样的应用程序. 智能客户端应用程序有利有弊.从有利的一面看,智能客户

nhibernate源码分析之二:会话工厂

会话工厂是NHibernate中的关键类,它与数据库连接.数据库事务等进行交互,还存储着与所有持久对象关联的持久化对象,持久化类是持久化的关键,它实现基本的CRUD操作.当用户需要持久操作时,由会话工厂创建一个会话供用户进行持久操作. 1. 会话工厂的创建 会话工厂由ISessionFactory接口实现,由Configuration的BuildSessionFactory方法创建,会话工厂应该使用Singleton模式.如果要访问多个数据库,应建立多个会话工厂. //*** Configura

NHibernate之旅(12):初探延迟加载机制

节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这篇我们初步探索NHibernate中的加载机制. 在讨论之前,我们看看我们使用的数据模型,回顾一下第二篇建立的数据模型. Customer与Orders是一对多关系,Order与Product是多对多关系.这一篇还是使用这个模型,有关具体配置和映射参考本系列的文章. 延迟加载(Lazy Loading

NHibernate之旅(5):探索Insert,Update,Delete操作

本节内容 操作数据概述 1.新建对象 2.删除对象 3.更新对象 4.保存更新对象 结语 操作数据概述 我们常常所说的一个工作单元,通常是执行1个或多个操作,对这些操作要么提交要么放弃/回滚.想想使用LINQ to SQL,一切的东西都在内存中操作,只有调用了DataContext.SubmitChanges()方法才把这些改变的数据提交到数据库中,LINQ to SQL那么提交要么回滚. 我们使用NHibernate也一样,如果只查询数据,不改变它的值,就不需要提交(或者回滚)到数据库. 注意

Asp.net MVC示例项目“Suteki.Shop”分析之NHibernate

在Suteki.Shop中内置了提供了基于NHibernate方式的ORM功能,只不过就目前的项目进度还未全部完 成其设计时的构想,另外在单元测试上也没有完整的测试.不过其设计思路还是很有意思的. 就 其将NHibernate引入到项目中的实现方式而言,与Rhino.Commons中所提倡的方式如出一辙,那就是基于 IRepository模式.关于IRepository这个接口的定义在之前的这篇文章中已提到并做了相应说明,所以 这里就不多做解释了. 好了,下面就开始今天的正文. 首先让我们看一下

ADO.NET与ORM的比较(4) EntityFramework实现CRUD

说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是 Spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操 作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具来操作数据. 在.NET中操作数据库的方式有多种,除了最直接的方式就是使用ADO.NET之外, 还可以使用NHibernate这个Hibernate在.NET中的实现ORM,如果你对第三方的 ORM 持怀疑态度,你还可以使用来自微软的实现.根正苗红的Lin

ADO.NET与ORM的比较(3) Linq to SQL实现CRUD

说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是 Spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操 作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具来操作数据. 在.NET中操作数据库的方式有多种,除了最直接的方式就是使用ADO.NET之外, 还可以使用NHibernate这个Hibernate在.NET中的实现ORM,如果你对第三方的 ORM 持怀疑态度,你还可以使用来自微软的实现.根正苗红的Lin