• 我对NHibernate的理解


    昨天使用了NHibernate,总结如下:

    首先建一个实体类,类的属性全部要为virtual(只要你用NHibernate,所有public,protected都必须为virtual,否则就会报错)。

    然后建一个实体名.hbm.xml的文件(实体名一定要对应),文件内容如下(本人由章松山亲笔写作,严禁复制及转载,违者追究法律责任。):

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
     <class name="Test.Model.Person, Test.Model" table="t_Person">Test.Model.Person是实体类,Test.Model是实体类的命名空间,t_Person是表名

    单主键如下:
      <id name="Id" type="Int32" unsaved-value="null">id适合单主键(本人由章松山亲笔写作,严禁复制及转载,违者追究法律责任。)
       <column name="t_Id" length="4" sql-type="int" not-null="true" unique="true" index="PK_Person"/>
       <generator class="assigned" />assigned表示值由程序分配,native则是自增列,当然要与数据表相匹配。
      </id>

    当是多主键时,配置如下:

    <composite-id class="Test.Model.主键类, 主键类" name = "Person类中的主键类名">
              <key-property name="主键类的属性1" type="String(10)" column="主键1" />
              <key-property name="主键类的属性2" type="String(10)" column="主键2" />
    </composite-id>
    以下是非主键的属性(本人由章松山亲笔写作,严禁复制及转载,违者追究法律责任。):
      <property name="Name" type="String">
       <column name="t_Name" length="50" sql-type="varchar" not-null="true"/>
      </property>
     </class>
    </hibernate-mapping>

    NHibernate的配置

    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
        <session-factory name="northwind">名称可不取
            <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
            <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
            <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
            <property name="connection.connection_string_name">Connection String</property>数据库连接字符串,App.Config将会有对应的配置
            <property name="connection.isolation">ReadCommitted</property>
            <property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>

            NHibernate.ByteCode.Castle要将对应的dll引用进来。

            <!-- Mapping Files -->
            <!--<mapping assembly="Test.Model"/>-->这里如果写了,程序中就不需要加了。
        </session-factory>
    </hibernate-configuration>

    需要引用的dll如下:

    NHibernate

    NHibernate.ByteCode.Castle

    log4net

    Iesi.Collections

    Castle.Core

    App.Config的配置

    <connectionStrings>
        <!--<add name="Connection String" connectionString="Data Source=hzxl;User Id=hzxl;Password=hzxl;Persist Security Info=true" providerName="System.Data.OracleClient"/>-->
        <add name="Connection String" connectionString="Data Source=B2BSQLSERVER;Database=TestOnly;uid=sa;pwd=sa" providerName="System.Data.SqlClient"/>
      </connectionStrings>

    ISession session = null;
    ISessionFactory factory = null;
    ITransaction trans = null;

    初始化: 

    Configuration ctg = new Configuration().Configure("./NHibernateMSSQL.config");
     ctg.AddAssembly("Test.Model");配置文件中如果有就不需要加这句了。
     factory = ctg.BuildSessionFactory();
     session = factory.OpenSession();

    添加:

    trans = session.BeginTransaction();
     //使用NHibernate的现有API
     //体验过程。。。。
     try
    {
         //对象的实例化方法
         Person p = new Person();
         p.Id = int.Parse(this.txtID.Text);
         p.Name = this.txtName.Text;
         p.CreateDate = DateTime.Now;
         //将对象保存到数据库
         //将对象p必须要转化成数据库能识别的SQL语句
         //由于在ISessionFactory已经保存了所有的OR映射
         //ISession能根据相应的方言来实现SQL语句
                    
            session.Save(p);
            trans.Commit();
        }
         catch (Exception)
         {
                    trans.Rollback();
         }

    查找:

    Person p = (Person)session.Get(typeof(Person), int.Parse(this.txtID.Text));

    更新:

     //开启事务
     trans = session.BeginTransaction();
     try
     {
             //根据提供的ID找到该对象
             Person p = (Person)session.Get(typeof(Person), int.Parse(this.txtID.Text));
             //修改对象的属性
              p.Name = this.txtName.Text;
              //将修改反映到数据库
              session.Update(p);
              trans.Commit();
     }
     catch (Exception)
      {
                    trans.Rollback();
      }

    删除:

    //开启事务
    trans = session.BeginTransaction();
    try
    {
           //
           //根据提供的ID找到该对象
            Person p = (Person)session.Get(typeof(Person), int.Parse(this.txtID.Text));
           //对象删除
             session.Delete(p);
             rans.Commit();
    }
    catch (Exception)
    {
           trans.Rollback();
    }

  • 相关阅读:
    Kafka 数据丢失问题总结
    HTTP3
    CnetOS7 控制台方式启动
    Win32Exception (0x8009030C) —— 密码过期 —— Kerberos 异常
    WebAPI Tip #8: Working with Tasks & WebAPI Tip #7: Beautiful Message Handlers (转发)
    Simple Testing Can Prevent Most Critical Failures: An Analysis of Production Failures in Distributed DataIntensive Systems(转发)
    git commond —— git merge —— 模拟某次 merge 操作
    git commad —— git lsfiles —— 获取 文件 的修改信息
    Using async/await or task in web api controller (.net core)
    Chrome debugger for vscode (react 使用vscode 调试 :debugger for chrome 被弃用, 改用 JavaScript Debugger)
  • 原文地址:https://www.cnblogs.com/zhangsongshan/p/NHibernate.html
Copyright © 2020-2023  润新知