NHibernate的灵活配置

原创 2007年09月26日 13:39:00
NHibernate的灵活配置

1.Visual Studio中文件的生成操作

在开始讨论这个话题前,我们想来看看Visual Studio中文件的生成操作。

无(None) - 不在项目输出组中包含该文件,并且在生成进程中不会对其进行编译。例如包含文档的文本文件,如自述文件。

编译(Compile) - 将该文件编译到生成输出中。此设置用于代码文件。

内容(Content) - 不编译该文件,但将其包含在“内容”(Content) 输出组中。例如,此设置是 .htm 或其他类型 Web 文件的默认值。

嵌入的资源(Embedded Resource) - 将该文件作为 DLL 或可执行文件嵌入主项目生成输出中。此设置通常用于资源文件。

 

对于嵌入的资源,我们可以启动“Visual Studio 2005 命令提示”,输入ildasm命令,使用启动的工具打开程序集文件,然后在MANIFEST中找到资源文件的信息,如下图。可以看见有名为“DDLLY.MyDoc.NHibernateTest.ConfigurationTest.hibernate1.cfg.xml”的资源文件。

 

2.Configuration配置

配置Configuration需要调用Configuration.Configure,我们来看看Configuration.Configure方法的信息

public Configuration Configure();

如果存在应用程序配置文件,则使用应用程序配置文件中的<hibernate-configuration>节点配置NHibernate,否则使用hibernate.cfg.xml进行配置。

public Configuration Configure(Assembly,string);
 
使用程序集中的资源配置NHibernate。
 
public Configuration Configure(string)
 
c.使用指定的文件配置NHibernate。
 
public Configuration Configure(XmlTextReader)
 
使用指定的XmlTextReader配置NHibernate。

 

我们可以使用多种方式进行配置,比较常见的配置有以下几种

a.可以在应用程序配置文件(对于普通程序而言为App.config,对Asp.net是Web.config)中进行配置,调用Configure()配置,配置文件如下
 
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<configSections>
    
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  
</configSections>

  
<nhibernate>
    
<add 
            
key="hibernate.show_sql"
            value
="true"
        
/>
    
<add 
            
key="hibernate.connection.provider"          
            value
="NHibernate.Connection.DriverConnectionProvider" 
        
/>
        
<add 
            
key="hibernate.dialect"                      
            value
="NHibernate.Dialect.MsSql2000Dialect" 
        
/>
        
<add 
            
key="hibernate.connection.driver_class"          
            value
="NHibernate.Driver.SqlClientDriver" 
        
/>
        
<add 
            
key="hibernate.connection.connection_string" 
            value
="server=.;database=user;uid=sa;pwd=App1234;" 
        
/>

  
</nhibernate>

</configuration>


 

这种配置方式只能对属性进行配置,不能配置映射类,而且应用程序配置文件可能还需要配置其他的信息,容易造成文件过于大,不方面浏览。所以我不推荐这种配置方式。

b.单独使用配置文件进行配置
 
b1.把配置文件放在程序应用程序同级目录,使用Configure()方法,此时配置文件名应为“hibernate.cfg.xml”
 
b2.把配置文件放到某个指定的路径,调用Configure(string)方法
 
b3.把配置文件作为资源嵌入到程序集(把文件的生成类型设置为"嵌入的资源"),调用Configure(Assembly,string)方法
 
 
这是一个典型配置文件
<?xml version="1.0" encoding="utf-8" ?>
<!--普通配置文件,使用程序集加载映射文件-->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.0">
    
<session-factory name="DDLLY.MyDoc.NHibernate.QuickStart">
        
<!-- 属性 -->
        
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        
<property name="connection.connection_string">server=.;database=user;uid=sa;pwd=App1234;</property>
        
<property name="show_sql">false</property>
        
<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
        
<property name="use_outer_join">true</property>
        
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
        
<!-- 映射文件 -->
        
<!--程序将加载DDLLY.MyDoc.NHibernateTest.Configuration命名空间所有的映射文件(*.hbm.xml)-->
        
<mapping assembly="DDLLY.MyDoc.NHibernateTest.ConfigurationTest" />
    
</session-factory>
</hibernate-configuration>

我写了个类来测试
using System.Reflection;
using NHibernate.Cfg;
using NUnit.Framework;

namespace DDLLY.MyDoc.NHibernateTest.ConfigurationTest.Test
{
    
/// <summary>
    
/// 测试ConfigurationTest.Configure()方法的测试类
    
/// </summary>

    [TestFixture]
    
public class ConfigureFixture
    
{
        
测试方法
    }

}

 让我们来看看配置文件,配置文件中主要配置的是各种属性和映射类的信息(还有缓存配置方面的信息,将在后面的章节讲到)。

在NHibernate.Cfg.Environment类中可以看到的可用属性信息。
例如Environment中public const string ConnectionString = "hibernate.connection.connection_string";

关于属性的说明可以查看NHibernate的文档。

映射文件的配置有以下几种方法

a.使用程序集中的所有资源文件

<!--程序将加载DDLLY.MyDoc.NHibernateTest.Configuration命名空间所有的映射文件(*.hbm.xml)-->
<mapping assembly="DDLLY.MyDoc.NHibernateTest.ConfigurationTest" />

b.使用指定文件

<!-- 映射文件 -->
<!--程序将加载指定的文件-->
<!--这种写法将加载和可执行程序的路径中的User.hbm.xml文件-->
<!--在Visual Studio把生成的可执行文件放在bin/Debug和bin/Release中-->
<!--所以此文件也要放在这两个目录中-->
<mapping file="User.hbm.xml" />

c.使用程序集中的指定资源文件

<!-- 映射文件 -->
<!--程序将加载指定的文件-->
<!--这种写法将加载加载资源文件-->
<mapping resource="DDLLY.MyDoc.NHibernateTest.ConfigurationTest.User.hbm.xml" assembly="DDLLY.MyDoc.NHibernateTest.ConfigurationTest" />

 

我们也可以使用代码来配置这些内容。

AddAssembly

添加程序集中所有以"hbm.xml"为结尾的文件作为映射文件。

示例:cfg.AddAssembly(Assembly.GetExecutingAssembly());

AddClass

使用协定从应用程序资源读取一个映射。类 Foo.Bar.Foo被映射为名为Foo.Bar.Foo.hbm.xml的嵌入在类所在的程序集中的资源文件。

示例:cfg.AddClass(typeof (User));

AddFile

从一个特别的XML文件读取映射。这个方法和AddXmlFile作用一样。

示例:cfg.AddFile("User.hbm.xml");

AddProperties

添加一个IDictionary类型的属性集合。Key是属性名,Value是属性的值。

示例:

//添加连接字符串属性
Hashtable properties = new Hashtable();
properties.Add(Environment.ConnectionString, //NHibernate.Cfg.Environment类中有所有的可属性信息
"server=.;database=user;uid=sa;pwd=App1234;");
cfg.AddProperties(properties);

我比较喜欢使用配置文件里面配置程序集的做法,因为这种做法最简单直接。

我们也可以把两种方式结合起来使用,例如我们可以在配置文件中配置好除连接字符串外的其它信息,然后在代码中添加连接字符串。

不管是映射信息还是属性信息最终都回被设置到Configuration里,我们可以查看Configuration的ClassMappings和Properties来查看这些信息。

同样我也写了两个类,前一个用来测试配置映射类。后一个用来测试配置属性。

测试配置映射

using System.Reflection;
using NHibernate.Cfg;
using NUnit.Framework;

namespace DDLLY.MyDoc.NHibernateTest.ConfigurationTest.Test
{
    
/// <summary>
    
/// 测试加载映射文件的类
    
/// </summary>

    [TestFixture]
    
public class ConfigMappingFixture
    
{
        
SetUp和TearDown

        
使用配置文件配置映射的测试

        
使用程序代码配置映射的测试
    }

}

 

测试配置属性

using System.Collections;
using System.Reflection;
using NHibernate.Cfg;
using NUnit.Framework;

namespace DDLLY.MyDoc.NHibernateTest.ConfigurationTest.Test
{
    
/// <summary>
    
/// 测试配置属性的类
    
/// </summary>

    [TestFixture]
    
public class ConfigPropertyFixture
    
{
        
SetUp和TearDown

        
测试方法
    }

}
注:本文中使用的是NH1.0.2.0版本,其他版本配置可能略有不同。

示例代码下载

数据库脚本下载

NHibernate的灵活配置

注:本文中使用的是NH1.0.2.0版本,其他版本配置可能略有不同。示例代码下载(没看明白的看看这个或许可以明白些)数据库脚本下载NHibernate的灵活配置1.Visual Studio中文件的生...
  • lee576
  • lee576
  • 2008年03月25日 20:12
  • 960

权限灵活可配-简单理解

权限: 百度百科:权限是指为了保证职责的有效履行,任职者必须具备的,对某事项进行决策的范围和程度。 对于任何系统来说权限可控制是必不可少的。下面来说说我对权限的理解! 权限涉及到用户,角色,菜...
  • hejingyuan6
  • hejingyuan6
  • 2014年01月23日 13:42
  • 2627

nhibernate的简单配置与使用

nhibernate配置、IOC注入
  • xiaoguidangjiajia
  • xiaoguidangjiajia
  • 2016年01月07日 17:55
  • 1752

灵活控制权限

继上篇《C#读取配置文件信息》        上篇提到读取配置文件信息,其中读取一般文件的信息目的是更加灵活地分配权限。用或的信息具体干什么在这里给大家细细道来。        为了让效果更佳,用对比...
  • u013037201
  • u013037201
  • 2016年04月08日 15:47
  • 661

NHibernate 基本配置 (第一篇)

使用NHibernate最重要的一步就是配置,如果连NHibernate都还没有跑的起来,谈何学习。今天就来详解一下NHibernate的配置。 一、NHibernate基本配置   NH...
  • mss359681091
  • mss359681091
  • 2016年09月21日 17:10
  • 568

NHibernate 非自增主键与自增主键的映射文件配置

在用NHibernate的时候, 当有表中的主键是数据库自动生成的时候(即设置的自增)将使用native: 而当是自己填写的时候则需要改为assigned: 否则将会出现异常! 以上是映射文件的...
  • ArvinStudy
  • ArvinStudy
  • 2012年07月13日 17:09
  • 3097

NHibernate开发环境与配置-NHibernate入门到精通系列2

上一篇:NHibernate ORM介绍及优缺点-NHibernate入门到精通系列1中介绍了NHibernate与ORM,读者对其有一个感性的认识。 本节,将继续此系统,介绍:NHibernate...
  • caolijunmingyan
  • caolijunmingyan
  • 2012年09月05日 13:39
  • 4477

ASP.NET中使用Nhibernate

基于上一篇,做了一个网页版的demo,方便以后学习。计划是找一个现有的项目按照自己搭的环境改写一下。 使用ASP.NET Razor 创建新的solution,导入相关引用以及package...
  • awawfwfw
  • awawfwfw
  • 2016年02月28日 14:50
  • 393

NHibernate读取配置文件的三种方式

Configuration config = new Configuration(); 这种配置方法将会到应用程序配置文件(App.Config,Web.Config)中查找NHibernate的配...
  • caolijunmingyan
  • caolijunmingyan
  • 2012年09月05日 13:11
  • 3582

NHibernate 设置字段的默认值的办法

默认值不是在配置文件中设置,也不是在代码的访问器中去设置,而是直接设置成员变量的初始值 例如: private DateTime createdtime=DateTime.Now; public...
  • rav009
  • rav009
  • 2012年09月10日 12:01
  • 2438
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NHibernate的灵活配置
举报原因:
原因补充:

(最多只允许输入30个字)