2010-04-09 73 views
1

映射如何我可能会使用一个存储过程从NHibernate的,但同时保持解决方案数据库无关和代码库干净的开关语句对每个方言的情况下?有条件的NHibernate命名查询的方言

我希望每创建包含特定数据库的SQL执行程序的内容数据库执行命名查询。我的困境是如何有条件地调用正确的命名查询。具体来说,我们现在正在针对MySQL和MS SQL Server 2008方言进行测试。

有谁知道如何创建通过方言条件命名查询地图? (这将允许各种存储过程实现存储在一个地方,以便于维护。)

做这样的事情就是我要做的事情,但我宁愿避免运行时检查的开销和编写任何代码,必须检查当前数据库的风味才能正常运行......

if (nhSession.GetSessionImplementation().Factory.Dialect == NHibernate.Dialect.MySQL5Dialect) { 
    // grab the MySQL named query here     
} else { 
    // grab the SQL Server named query here 
} 

有没有办法做这样的事情呢? (下面是一厢情愿的伪编码...)

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
<dialect-filter dialect="mysql"> 
    <sql-query name="spForMySQL" callable="true"> 
    <query-param name="mySqlP1" type="int" /> 
    <return alias="OutType" class="Domain.ResultType, Domain"> 
     <return class="ResultType"> 
     <return-property column="col1" name="Id" /> 
     <return-property column="col2" name="Name" /> 
     </return> 
    </return> 
    call spName(:mySqlP1) 
    </sql-query> 
</dialect-filter> 
<dialect-filter dialect="SQLServer"> 
    <sql-query name="spForSQLServer" callable="true"> 
    <query-param name="sqlServerP1" type="int" /> 
    <return alias="OutType" class="Domain.ResultType, Domain"> 
     <return class="ResultType"> 
     <return-property column="col1" name="Id" /> 
     <return-property column="col2" name="Name" /> 
     </return> 
    </return> 
    exec spForSQLServer @sqlServerP1= :sqlServerP1 
    </sql-query> 
</dialect-filter> 
</hibernate-mapping> 

回答

1

来完成类似的东西会根据你对工作的数据库把你的地图,不同的组件和加载地图的最简单方法。

使用FluentNHibernate它应该是这样的:

bool isSql = true; 

var factory = Fluently.Configure() 
... 
.Mappings(x => isSql ? x.HbmMappingFromAssemblyOf<SqlServerMaps>() : x.HbmMappingFromAssemblyOf<MySqlMaps>())