2010-04-09 67 views
1

映射如何我可能會使用一個存儲過程從NHibernate的,但同時保持解決方案數據庫無關和代碼庫乾淨的開關語句對每個方言的情況下?有條件的NHibernate命名查詢的方言

我希望每創建包含特定數據庫的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

來完成類似的東西會根據你對工作的數據庫把你的地圖,不同的組件和加載地圖的最簡單方法。

使用FluentNHibernate它應該是這樣的:

bool isSql = true; 

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