Условное сопоставление именованных запросов NHibernate по диалекту - PullRequest
1 голос
/ 09 апреля 2010

Как я могу использовать хранимую процедуру из 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 Ответ

1 голос
/ 05 мая 2011

Самый простой способ сделать что-то подобное - поместить карты в разные сборки и загрузить карты в зависимости от базы данных, с которой вы работаете.

При использовании FluentNHibernate это будет выглядеть так:

bool isSql = true;

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