01-01-01【Nhibernate (版本3.3.1.4000) 出入江湖】配置文件

默认配置文件名称是:hibernate.cfg.xml

放置在应用程序集的根目录下

<?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 name="NHibernate.Test123456">
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">

      <!--用于测试自动生成数据库表(不自动生成数据库)-->
      <!--<property name="hbm2ddl.auto">update</property>-->
      Server=(local);initial catalog=NHibernateSampleAutoCreateTable;Integrated Security=SSPI

      <!--Server=(local);initial catalog=NHibernateSample;Integrated Security=SSPI-->
    </property>
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>

    <!--输出所有的SQL语句到控制台,一般开发打开这个-->
    <property name="show_sql">true</property>
    <!--整齐的SQL输出到控制台-->
    <property name="format_sql">true</property>
    
    <!--自动生成数据库表(不自动生成数据库)-->
    <property name="hbm2ddl.auto">update</property>
    
    <!--实体类所在的程序集-->
    <mapping assembly="Model"/>
    </session-factory>
</hibernate-configuration>

实体的映射文件 xxx.hbm.xml 文件满足:

1.只要和实体类在同一个程序就行,在什么目录里面没要求

2.右键-.xxx.hbm.xml---属性---“生成操作”属性设置为“嵌入式资源”

3.与实体类同名,如:实体类名是Customer,那映射文件就是Customer.hbm.xml

Customer.cs
using Iesi.Collections.Generic;
using System;
using System.Linq;
using System.Text;

namespace Model
{
    public class Customer
    {
        public virtual int CustomerId{ get; set; }
        public virtual String FirstName { get; set; }
        public virtual String LastName { get; set; }

        public virtual int Age { get; set; }
        public virtual int Version { get; set; }

        private ISet<Order> _orders = new HashedSet<Order>();
        public virtual ISet<Order> Orders
        {
            get { return _orders; }
            set { this._orders = value; }
        }

    }
}
Order.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Model
{
    public class Order
    {
        public virtual int OrderId { get; set; }
        public virtual DateTime OrderDate { get; set; }
        public virtual Customer Customer { get; set; }

        public virtual int Version { get; set; }
    }
}
 

Customer.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                   namespace="Model" 
                   assembly="Model" 
                   default-lazy="true">
  
  <class name="Model.Customer, Model"
         discriminator-value="0">
    <!--unsaved-value="0" 主键表中不需要定义,而是需要在子表中定义-->
    <id name="CustomerId"
        column="CustomerId"
        type="int" 
        unsaved-value="0">
      <generator class="native" />
      <!-- unsaved-value used to be null and generator was increment in h2.0.3 -->
    </id>

    <!--version标签必须放在Id后面,否则出错-->
    <version name="Version"/>

    <property name="FirstName" >
      <column name="Firstname" length="50" not-null="true"/>
    </property>

    <property name="LastName" type="String">
      <column name="Lastname"/>
    </property>

    <property name="Age" type="int">
      <column name="Age"/>
    </property>

    <!--双向关联时要用:
         inverse:由子表来维护关系,cascade:级联的关系 如果没有这个设置,
        插入Customer成功(即使现在Order插入Order抛异常,这时产生了垃圾数据,
        好的做法是用事务两者都能插入,避免垃圾数据的产生-->
    <!--经测试:只需要在主表配置cascade="all",而子表不用配置cascade="all",
    当删除主表实体时,子表的级联实体也会被删除-->
    <!--cascade有几种??是吗??,分别表示级联操作的4种操作:
      cascade = "none": 不能执行操作(有子时不给删父),经测试,为none时,添加父时没有自动添加子
      cascade = "delete" : 1.级联(删父时删子),经测试,为delete时,添加父时自动添加子,
                        2.经测试,当设置cascade = "all",MS SQL Server设置删除和更新操作虽然设置为:不执行操作,却被覆盖为联级
      cascade = "null": (删父时子设置为null),但经测试Nhibernate不支持这个值
      cascade = "???": 删父时子设置为默认值
      cascade = "save-update":
      cascade = "delete":
      cascade = "all":
      cascade = "all-delete-orphan":
       -->
    <set name="Orders" table="Order" generic="true"
          inverse="true" cascade="all">
      <key column="CustomerId" foreign-key="FK_CustomerOrders"/>
      <one-to-many class="Model.Order,Model"/>
    </set>
  </class>
</hibernate-mapping>
View Code

Order.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                   namespace="Model" 
                   assembly="Model" 
                   default-lazy="true">
  
  <!--table ="[Order]"因为Order是SQL关键字,表名如果不添加中括号[]会抛异常-->
  <!--unsaved-value="0" 主键表中不需要定义,而是需要在子表中定义
      unsaved-value id的类型是对象类型(如Int32等)unsaved-value不用显示标出来,因为unsaved-value默认值是null
  unsaved-value默认值是null,
  作用是:用于判断实体对象是新new的内存对象,还是应经持久化的对象,Nhibernate会从数据库中去获取
  该实体对象的Id与unsaved-value的值比较(如果持久化,id不等于null,当然也就不等于默认值为unsaved-value):
  
  1.实体对象的Id与unsaved-value的值,相等,说明调用Save()添加,
  2.实体对象的Id与unsaved-value的值,不相等相等,调用Update(),
          
     并在如果
  -->
  <class name="Model.Order, Model" 
         table ="[Order]"
         discriminator-value="0" lazy="false">
    <id name="OrderId"
        column="OrderId"
        type="int" 
        unsaved-value="0">
 <!--     unsaved-value="0">-->
      <generator class="native" />
      <!-- unsaved-value used to be null and generator was increment in h2.0.3 -->
    </id>
    
    <!--version标签必须放在Id后面,否则出错-->
    <!--<version name="Version"/>-->
   
    <property name="OrderDate"  type="DateTime"  not-null="true">
      <column name="OrderDate" />
    </property>

    <many-to-one name="Customer" not-null="true">
      <column name="CustomerId" />
    </many-to-one>
    
  </class>
</hibernate-mapping>
View Code

 其他:

为了使用NHibernate时有输入提示,得在:

D:Program Files (x86)Microsoft Visual Studio 12.0XmlSchemas

添加下载的NHibernate安装包中的两文件:

nhibernate-configuration.xsd

nhibernate-mapping.xsd

原文地址:https://www.cnblogs.com/easy5weikai/p/3751717.html