2010-07-26 51 views
3

我使用以下公式在我的映射文件:Nhibernate的式附加模板字到SQL關鍵字

選擇從表SI頂部1 SI.ID與(NOLOCK)其中SI.GUID = GUID和SI.IsArchive = '0'

的genrated SQL是: 從表SI 與(this_.nolock)其中SI.GUID = this_.GUID而SI.IsArchive = '0'

選擇頂部1 SI.ID nolock是一個關鍵字。我不希望它符合這個_。(模板關鍵字)。

我該如何改變這種行爲?

回答

0

可以嘗試重構式邏輯到用戶定義函數(假設這是這裏的SQL Server),並直接調用從式。您甚至可以通過使用數據庫對象映射將模型生成功能部分。

例如:

CREATE FUNCTION [dbo].[GetMyValue] (@entityId INT) 
    RETURNS INT 
    AS BEGIN 
     DECLARE @RtnValue AS INT 
     SELECT @RtnValue = top 1 SI.ID from Table SI with(nolock) where SI.id = @entityId AND SI.IsArchive = '0' 
     RETURN @RtnValue 
    END 

和MAP這樣

formula="dbo.GetMyValue(id)" 

這應該,在理論上,防止任何類型的關鍵字替換的情況發生。

0

可能可以在nhibernate配置中使用查詢替換來解決此問題;例如:

<property name="hibernate.query.substitutions">mynolock nolock</property> 

和MAP這樣:

select top 1 SI.ID from Table SI with(mynolock) where SI.GUID = GUID And SI.IsArchive = '0' 
+0

我不確定這是否真的有效(而且看起來沒有)。我有另一個想法讓你嘗試,我將它作爲一個新的答案... – DanP 2010-07-27 13:28:40

+0

新的建議做到了這一招 – techrich 2010-07-28 07:34:48