我使用以下公式在我的映射文件: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是一個關鍵字。我不希望它符合這個_。(模板關鍵字)。
我該如何改變這種行爲?
我使用以下公式在我的映射文件: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是一個關鍵字。我不希望它符合這個_。(模板關鍵字)。
我該如何改變這種行爲?
可以嘗試重構式邏輯到用戶定義函數(假設這是這裏的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)"
這應該,在理論上,防止任何類型的關鍵字替換的情況發生。
可能可以在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'
我不確定這是否真的有效(而且看起來沒有)。我有另一個想法讓你嘗試,我將它作爲一個新的答案... – DanP 2010-07-27 13:28:40
新的建議做到了這一招 – techrich 2010-07-28 07:34:48