簡體   English   中英

使用方言的條件NHibernate命名查詢映射

[英]Conditional NHibernate Named Query Mapping by Dialect

如何使用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>

完成類似操作的最簡單方法是將地圖放在不同的程序集中,並根據要操作的數據庫加載地圖。

使用FluentNHibernate看起來像這樣:

bool isSql = true;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM