• 知识点 NHibernate


    1. 什么是NHibernate 
      NHibernate 是一个面向.NET 环境的对象/关系数据库映射工具。对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL 的关系模型数据结构中去。
    2. NHibernate中的查询方法

    • NHibernate查询语言(HQL,NHibernate Query Language)
    • 条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况)
    • 原生SQL(Literal SQL,T-SQL、PL/SQL)

    3. NHibernate中的事务

    • NHibernate使用事务要使用using强制资源清理和异常机制
      using (ITransaction tx = _session.BeginTransaction())
      {
          try
          {
              //一些保存、更新、删除等操作
              tx.Commit();
          }
          catch (HibernateException)
          {
              tx.Rollback();
              throw;
          }
      }
      

       

    • 在任何时候都要使用事务,即使是在读取、查询数据的时候,为什么呢?因为你不清楚数据库什么时候操作失败,如何恢复原来数据。而NHibernate中的事务(可以通过 tx.Rollback()方法),帮助我们完成这些事情。  

    4. NHibernate并发控制

    • 悲观并发控制
    • 乐观并发控制(NHibernate支持)

    5. NHibernate关系

    • NHibernate支持/定义的几种类型的集合:
      Bag:对象集合,每个元素可以重复。例如{1,2,2,6,0,0},在.Net中相当于IList或者IList<T>实现。
      Set:对象集合,每个元素必须唯一。例如{1,2,5,6},在.Net中相当于ISet或者ISet<T>实现,Iesi.Collections.dll程序集提供ISet集合。
      List:整数索引对象集合,每个元素可以重复。例如{{1,"YJingLee"},{2,"CnBlogs"},{3,"LiYongJing"}},在.Net中相当于ArraryList或者        List<T>实现。
      Map:键值对集合。例如{{"YJingLee",5},{"CnBlogs",7},{"LiYongJing",6}},在.Net中相当于HashTable或者IDictionary<Tkey,TValue>实现。
    • Customer与Order的一对多关系映射:
      Customer.cs
      using Iesi.Collections.Generic;
      
      namespace DomainModel.Entities
      {
          public class Customer
          {
              public virtual int CustomerId { get; set; }
              public virtual string Firstname { get; set; }
              public virtual string Lastname { get; set; }
              //一对多关系:Customer有一个或多个Orders
              public virtual ISet<Order> Orders { get; set; }
          }
      }
      

      Customer.hbm.xml

      <?xml version="1.0" encoding="utf-8" ?>
      <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                         assembly="DomainModel" namespace="DomainModel">
      
        <class name ="DomainModel.Entities.Customer,DomainModel"
               table="Customer">
          <id name="CustomerId" column="CustomerId" type="Int32" 
              unsaved-value="0">
            <generator class ="native"></generator>
          </id>
          <property name="Firstname" column ="Firstname" type="string"
                    length="50" not-null="false"/>
          <property name ="Lastname" column="Lastname" type="string"
                    length="50" not-null="false"/>
          <!--一对多关系:Customer有一个或多个Orders-->
          <set name="Orders" table="`Order`" generic="true" inverse="true">
                <key column="Customer" foreign-key="FK_CustomerOrders"/>
                <one-to-many class="DomainModel.Entities.Order,DomainModel"/>
          </set>
        </class>
      </hibernate-mapping>
      
    • Customer与Order的一对多关系映射:
      Order.cs
      namespace DomainModel.Entities
      {
          public class Order
          {
              public virtual int OrderId { get; set; }
              public virtual DateTime OrderDate { get; set; }
              //多对一关系:Orders属于一个Customer
              public virtual Customer Customer { get; set; }
          }
      }
      

      Order.hbm.xml

      <?xml version="1.0" encoding="utf-8" ?>
      <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                         assembly="DomainModel" namespace="DomainModel">
        
        <class name="DomainModel.Entities.Order,DomainModel" table="`Order`" >
          <id name="OrderId" column="OrderId" type="Int32" unsaved-value="0">
            <generator class="native" />
          </id>
          <property name="OrderDate" column="OrderDate" type="DateTime"
                    not-null="true" />
          <!--多对一关系:Orders属于一个Customer-->
          <many-to-one name="Customer" column="Customer" not-null="true"
                       class="DomainModel.Entities.Customer,DomainModel"
                       foreign-key="FK_CustomerOrders" />
        </class>
      </hibernate-mapping>
      
    • Order与Product的多对多关系映射:
      Order.cs
      namespace DomainModel.Entities
      {
          public class Order
          {
              public virtual int OrderId { get; set; }
              public virtual DateTime OrderDate { get; set; }
              //多对一关系:Orders属于一个Customer
               public virtual Customer Customer { get; set; }
              //多对多关系:Order有多个Products
               public virtual IList<Product> Products { get; set; }
          }
      }
      

      Order.hbm.xml

      <?xml version="1.0" encoding="utf-8" ?>
      <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                         assembly="DomainModel" namespace="DomainModel">
        
        <class name="DomainModel.Entities.Order,DomainModel" table="`Order`" >
      
          <id name="OrderId" column="OrderId" type="Int32" unsaved-value="0">
            <generator class="native" />
          </id>
          <property name="OrderDate" column="OrderDate" type="DateTime" not-null="true" />
          <!--多对一关系:Orders属于一个Customer-->
          <many-to-one name="Customer" column="Customer" not-null="true"
                       class="DomainModel.Entities.Customer,DomainModel"
                       foreign-key="FK_CustomerOrders" />
          <!--多对多关系:Order有多个Products-->
          <bag name="Products" generic="true" table="OrderProduct">
               <key column="`Order`" foreign-key="FK_OrderProducts"/>
               <many-to-many column="Product" 
                          class ="DomainModel.Entities.Product,DomainModel" 
                          foreign-key="FK_ProductOrders"/>
          </bag>
        </class>
      </hibernate-mapping>
      
    • Order与Product的多对多关系映射
      Product.cs
      namespace DomainModel.Entities
      {
          public class Product
          {
              public virtual int ProductId { get; set; }
              public virtual string Name { get; set; }
              public virtual float Cost { get; set; }
              //多对多关系:Product属于多个Orders
              public virtual IList<Order> Orders { get; set; }
          }
      }
      

      Product.hbm.xml

      <?xml version="1.0" encoding="utf-8" ?>
      <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                         assembly="DomainModel" namespace="DomainModel">
        <class name="DomainModel.Entities.Product,DomainModel" table="Product">
          
          <id name="ProductId" column ="ProductId" type="Int32" unsaved-value="0">
            <generator class="native"/>
          </id>    
          <property name="Name" column="Name" type="string" not-null="true" length="50"/>
          <property name="Cost" column="Cost" type="float" not-null="true"/>
           <!--多对多关系:Product属于多个Orders-->
          <bag name="Orders" generic="true" table="OrderProduct">
              <key column="Product" foreign-key="FK_ProductOrders"/>
              <many-to-many column="`Order`" 
                          class="DomainModel.Entities.Order,DomainModel"
                          foreign-key="FK_OrderProducts"/>
          </bag>    
        </class>
      </hibernate-mapping>
      

       

    6. NHibernate的加载机制

    • 延迟加载
      使用代理模式
    • 立即加载
      可选的lazy属性
      NHibernate提供的实用类
      HQL抓取策略

    7. NHibernate中使用视图
      在NHibernate中使用视图,同表类似,只是属性访问权限不同罢了。视图是只读的,所以把属性的Setter设置为private访问权限。

    8. NHibernate中使用存储过程
      

     

    引自:http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html

  • 相关阅读:
    VMware安装Centos7超详细过程
    Linux部署Web项目
    Entity Framework快速入门IQueryable与IEnumberable的区别
    ASP.NET MVC3中的路由系统(Routes)
    C# Lambda表达式概述
    WCF大数据量传输解决要点
    div滚动条样式设计
    ASP.NET MVC 自定义路由
    C# Lambda表达式学习笔记
    C# 操作excel
  • 原文地址:https://www.cnblogs.com/raysbo/p/2964055.html
Copyright © 2020-2023  润新知