【问题标题】:Conditional NHibernate Named Query Mapping by Dialect通过方言的条件 NHibernate 命名查询映射
【发布时间】:2010-04-09 19:53:34
【问题描述】:

我如何使用 NHibernate 中的存储过程,但同时保持解决方案与数据库无关,并且代码库中的 switch 语句干净,每种方言都有一个案例?

我希望为每个数据库实现创建一个命名查询,其中包含该过程的特定于数据库的 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>

【问题讨论】:

    标签: c# .net nhibernate nhibernate-mapping


    【解决方案1】:

    完成类似操作的最简单方法是将地图放在不同的程序集中,并根据您正在操作的数据库加载地图。

    使用 FluentNHibernate 会如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-16
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多