我如何使用NHibernate中的存储过程,但同时保持解决方案数据库不可知和代码库清除switch语句与每个Dialect的情况?
我希望为每个数据库实现创建一个命名查询,其中包含该过程的特定于数据库的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>
答案 0 :(得分:1)
实现此类目标的最简单方法是将地图放在不同的程序集中,并根据您正在操作的数据库加载地图。
使用FluentNHibernate看起来像这样:
bool isSql = true;
var factory = Fluently.Configure()
...
.Mappings(x => isSql ? x.HbmMappingFromAssemblyOf<SqlServerMaps>() : x.HbmMappingFromAssemblyOf<MySqlMaps>())