配置文件如下
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
<?
xml version
=
"
1.0
"
?>
< configuration >
< configSections >
< section name = " hibernate-configuration " type = " NHibernate.Cfg.ConfigurationSectionHandler,NHibernate " />
< section name = " syscache " type = " NHibernate.Caches.SysCache.SysCacheSectionHandler,NHibernate.Caches.SysCache " />
</ configSections >
< connectionStrings >
< add name = " db " connectionString = " Server=.;Database=NHTest;Trusted_Connection=SSPI " />
< add name = " nhtest " connectionString = " Data Source=orcl; Persist Security Info=True;Integrated Security=False;User ID=nhtest;Password=nhtest; " />
</ connectionStrings >
<!-- Oracle -->
< hibernate - configuration xmlns = " urn:nhibernate-configuration-2.2 " >
< session - factory >
< property name = " proxyfactory.factory_class " > NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle </ property >
< property name = " dialect " > NHibernate.Dialect.Oracle10gDialect,NHibernate </ property >
< property name = " connection.driver_class " > NHibernate.Driver.OracleClientDriver,NHibernate </ property >
< property name = " connection.connection_string_name " > nhtest </ property >
< property name = " adonet.batch_size " > 100 </ property >
< property name = " show_sql " > true </ property >
< property name = " hbm2ddl.auto " > update </ property >
< property name = " cache.provider_class " > NHibernate.Caches.SysCache.SysCacheProvider,NHibernate.Caches.SysCache </ property >
<!--< property name = " cache.use_second_level_cache " > true </ property >
< property name = " cache.use_query_cache " > true </ property >-->
<!--< class - cache class = " Test.Nh3.Domain, Test.Nh3 " region = " hourly " usage = " read-only " />-->
</ session - factory >
</ hibernate - configuration >
< syscache >
< cache region = " hourly " expiration = " 60 " priority = " 3 " />
</ syscache >
< runtime >
< assemblyBinding xmlns = " urn:schemas-microsoft-com:asm.v1 " >
< dependentAssembly >
< assemblyIdentity name = " NHibernate " publicKeyToken = " AA95F207798DFDB4 " culture = " neutral " />
< bindingRedirect oldVersion = " 0.0.0.0-3.0.0.2002 " newVersion = " 3.0.0.2002 " />
</ dependentAssembly >
</ assemblyBinding >
</ runtime >
</ configuration >
< configuration >
< configSections >
< section name = " hibernate-configuration " type = " NHibernate.Cfg.ConfigurationSectionHandler,NHibernate " />
< section name = " syscache " type = " NHibernate.Caches.SysCache.SysCacheSectionHandler,NHibernate.Caches.SysCache " />
</ configSections >
< connectionStrings >
< add name = " db " connectionString = " Server=.;Database=NHTest;Trusted_Connection=SSPI " />
< add name = " nhtest " connectionString = " Data Source=orcl; Persist Security Info=True;Integrated Security=False;User ID=nhtest;Password=nhtest; " />
</ connectionStrings >
<!-- Oracle -->
< hibernate - configuration xmlns = " urn:nhibernate-configuration-2.2 " >
< session - factory >
< property name = " proxyfactory.factory_class " > NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle </ property >
< property name = " dialect " > NHibernate.Dialect.Oracle10gDialect,NHibernate </ property >
< property name = " connection.driver_class " > NHibernate.Driver.OracleClientDriver,NHibernate </ property >
< property name = " connection.connection_string_name " > nhtest </ property >
< property name = " adonet.batch_size " > 100 </ property >
< property name = " show_sql " > true </ property >
< property name = " hbm2ddl.auto " > update </ property >
< property name = " cache.provider_class " > NHibernate.Caches.SysCache.SysCacheProvider,NHibernate.Caches.SysCache </ property >
<!--< property name = " cache.use_second_level_cache " > true </ property >
< property name = " cache.use_query_cache " > true </ property >-->
<!--< class - cache class = " Test.Nh3.Domain, Test.Nh3 " region = " hourly " usage = " read-only " />-->
</ session - factory >
</ hibernate - configuration >
< syscache >
< cache region = " hourly " expiration = " 60 " priority = " 3 " />
</ syscache >
< runtime >
< assemblyBinding xmlns = " urn:schemas-microsoft-com:asm.v1 " >
< dependentAssembly >
< assemblyIdentity name = " NHibernate " publicKeyToken = " AA95F207798DFDB4 " culture = " neutral " />
< bindingRedirect oldVersion = " 0.0.0.0-3.0.0.2002 " newVersion = " 3.0.0.2002 " />
</ dependentAssembly >
</ assemblyBinding >
</ runtime >
</ configuration >
初始化Mapper
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public
HbmMapping GetMapping()
{
// 初始化ObjectRelationalMapper类
var orm = new ObjectRelationalMapper();
// TablePerClass:每个类一张表映射策略
// TablePerClassHierarchy:每个类分层结构一张表映射策略
// TablePerConcreteClass:每个具体类一张表映射策略
orm.TablePerClass < Domain > ();
// orm.Patterns.Poids.Add(new GuidCombGeneratorDef());
// 在这里可以调用ObjectRelationalMapper类一些方法配置Domain语义
// 使用orm参数初始化Mapper类
var mapper = new Mapper(orm);
// 在这里可以调用Mapper类一些方法配置Domain的Mapping
// 调用Mapper类的CompileMappingFor方法编译生成HbmMapping对象
return mapper.CompileMappingFor( new [] { typeof (Domain) });
}
{
// 初始化ObjectRelationalMapper类
var orm = new ObjectRelationalMapper();
// TablePerClass:每个类一张表映射策略
// TablePerClassHierarchy:每个类分层结构一张表映射策略
// TablePerConcreteClass:每个具体类一张表映射策略
orm.TablePerClass < Domain > ();
// orm.Patterns.Poids.Add(new GuidCombGeneratorDef());
// 在这里可以调用ObjectRelationalMapper类一些方法配置Domain语义
// 使用orm参数初始化Mapper类
var mapper = new Mapper(orm);
// 在这里可以调用Mapper类一些方法配置Domain的Mapping
// 调用Mapper类的CompileMappingFor方法编译生成HbmMapping对象
return mapper.CompileMappingFor( new [] { typeof (Domain) });
}
初始化config
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
var nhConfig
=
new
Configuration().Configure();
nhConfig.AddDeserializedMapping(GetMapping(), null );
// 配置缓存
nhConfig.SetProperty(NHibernate.Cfg.Environment.UseSecondLevelCache, " true " )
.SetProperty(NHibernate.Cfg.Environment.UseQueryCache, " true " )
.Cache(c => c.Provider < SysCacheProvider > ())
.EntityCache < Domain > (c =>
{
c.Strategy = EntityCacheUsage.ReadWrite;
c.RegionName = " hourly " ;
});
// 配置数据库架构元数据
// SchemaMetadataUpdater.QuoteTableAndColumns(nhConfig);
// 创建数据库架构
// new SchemaExport(nhConfig).Create(false, true);
var factory = nhConfig.BuildSessionFactory();
using (var s = factory.OpenSession())
{
using (var tx = s.BeginTransaction())
{
var domain = new Domain
{
Name = " 我的测试 " + DateTime.Now.ToString(),
Address = " 中国 " ,
Picture = GetPic()
};
s.Save(domain);
tx.Commit();
}
}
nhConfig.AddDeserializedMapping(GetMapping(), null );
// 配置缓存
nhConfig.SetProperty(NHibernate.Cfg.Environment.UseSecondLevelCache, " true " )
.SetProperty(NHibernate.Cfg.Environment.UseQueryCache, " true " )
.Cache(c => c.Provider < SysCacheProvider > ())
.EntityCache < Domain > (c =>
{
c.Strategy = EntityCacheUsage.ReadWrite;
c.RegionName = " hourly " ;
});
// 配置数据库架构元数据
// SchemaMetadataUpdater.QuoteTableAndColumns(nhConfig);
// 创建数据库架构
// new SchemaExport(nhConfig).Create(false, true);
var factory = nhConfig.BuildSessionFactory();
using (var s = factory.OpenSession())
{
using (var tx = s.BeginTransaction())
{
var domain = new Domain
{
Name = " 我的测试 " + DateTime.Now.ToString(),
Address = " 中国 " ,
Picture = GetPic()
};
s.Save(domain);
tx.Commit();
}
}
尽管配置了缓存,性能问题依然出现在picture保存上面,竟然需要20多秒,期待有人能研究出这个解决办法。
-------------------------------------------------------------
构造领域模型时需要使用如下代码,等同于在*.hbm.xml文件将实体列映射的类型显式声明
var mapper = new Mapper(orm);
mapper.Class<Domain>(dm =>
{
dm.Property(x => x.Picture,
m => m.Type(NHibernate.NHibernateUtil.BinaryBlob));
});