代码之家  ›  专栏  ›  技术社区  ›  Tahbaza

按方言命名的条件查询映射

  •  1
  • Tahbaza  · 技术社区  · 16 年前

    如何使用来自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>
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Søren Spelling Lund    15 年前

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

    使用FluentHibernate,会出现如下情况:

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