曾经了解过hibernate, 印象很深,是个很不错得o/r mapping fw. 在http://nhibernate.sourceforge.net/上有个从java移植过来得.net版本--nhibernate(以下称nh),不过目前还处于prealpha build 2阶段.
准备工作如下:
1. nhibernate prealpha build 2
2. nunit
3. nhibernate配置文件 monitoring.dll.config 如下:
<configuration>
<configsections>
<section name="nhibernate" type= "system.configuration.namevaluesectionhandler,system,version=1.0.3300.0,culture=neutral, publickeytoken=b77a5c561934e089" />
</configsections>
<nhibernate>
<add key="hibernate.show_sql" value="false"/><!-- 设置是否输出sql语句到console -->
<add key="hibernate.connection.provider" value="nhibernate.connection.driverconnectionprovider" />
<add key="hibernate.dialect" value="nhibernate.dialect.mssql2000dialect" /><!--设置使用sql server的方言,毕竟不同db的sql有或多或少的区别 -->
<add key="hibernate.connection.driver_class" value="nhibernate.driver.sqlclientdriver" /> <!-- 设置使用的db驱动-->
<add key= "hibernate.connection.connection_string"value="server=zephyr;initial catalog= argus;userid=sa;password=zephyr;min pool size=2" /> <!-- 设置连接串 -->
</nhibernate>
</configuration>
可以看出以上是一个标准得config文件,一般由system.configuration.configurationsettings.getconfig方法来读取.
蓝色部分才是真正配置nh的地方, 例子中我配置它使用sql server, 那些key/value的含义很好明白.
值得注意得是,配置文件得文件名很重要,通常对于一个exe得assembly来说,是assemblyname.config,不过对于dll assembly来,对应的配置文件为assemblyname.dll.config 例如:
myassy.exe -> myassy.config
myassy.dll -> myassy.dll.config
我打算在我的monitoring.dll,一个用来监视性能东东中使用nh来持久化数据. 该类库包含了一个testcase,由nunit来调用
4.将要被持久化的对象, 即business object(bo)
namespace argus.monitoring
{
public class monitor
{
//dbid & dbid 是nh必须要求的主键
private int dbid;
public int dbid{set{dbid=value;}get{return dbid;}}
public string monitortype {get{return "dummy monitor";}}
public double value {get{return 12.34;}
public string category{get{return "this is category";}}
public string name{get{return "this is name";}}
public string instance{get{return "this is instance";}}
public string computer{get{return "this is computer";}}
}
这是一个被极度简化的类,省略了member method,甚至property的set方法,因为我打算先试试insert功能,然后再尝试load功能
5. 写一个该bo对应的最简单的映射文件
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<!-- 指明bo的全名和所在assembly的名字以及在数据库中对应的表名-->
<class name="argus.monitoring.monitor,monitoring" table= "record">
<id name="dbid" type="int32">
<generator class="identity"/><!-- 在数据库表中 id列设成自动加一的主键-->
</id>
<!--若不设column属性,则默认bo中属性名称和表中字段名一致,若不指明type,则通过反射bo的属性来得到列的数据类型-->
<property name="computer" type="string(50)"/>
<property name="category" type="string(50)"/>
<property name="name" column="counter" type="string(50)"/>
<property name="instance" type="string(50)"/>
<!--此处bo的value属性被映射到data列-->
<property name="value" column="data" type="double"/>
<property name="monitortype" type="string(50)"/>
</class>
</hibernate-mapping>
6. 最后一步 (好累啊~~~), testcase:
using system;
using nunit.framework;
using nhibernate;
using argus.monitoring;
namespace test.monitoring
{
[testfixture]
public class monitoringtest
{
[test] public void nhibernatetest ()
{
argus.monitoring.monitor m=new argus.monitoring.monitor ();
nhibernate.cfg.configuration cfg=new nhibernate.cfg.configuration ();
cfg.addxmlfile ("argus.monitoring.monitor.hbm.xml");
isession session= cfg.buildsessionfactory ().opensession();
session.save (m);
session.close ();
}
}
}
闽公网安备 35060202000074号