2013-01-18 66 views
0

我試圖使用NHibernate實現以下TSQL代碼(目前包裝在存儲過程中)。正如你所看到的,系統已經實現了一些自定義排序。NHibernate的依賴項更新/插入

DECLARE @NextSequence bigint; 

UPDATE [dbo].[Sequencer] SET @NextSequence = Sequence = Sequence + 1; 

INSERT INTO [dbo].[Customers] (Id,Name) VALUES (@NextSequence, 'Jack'); 

INSERT聲明取決於UPDATE和路@NextSequence變量被設置是非常重要的。

如何在使用NHibernate的單個數據庫事務/調用中執行此操作?

回答

0

你有多種選擇來實現這一目標,

  1. 可以使用NHibernate的CreateSQLQuery字面SQL傳遞給數據庫,因此,這樣一來就可以執行存儲過程,而不是擔心個人聲明。

    session.CreateSQLQuery(@"EXECUTE PROCEDURE <procedure>").ExecuteUpdate(); 
    
  2. 但是,好像你正試圖插入新行Customer用新Sequence值之前增加一個字段(Sequence)。你爲此需要create a trigger,並完全繞過NHibernate。

  3. 另一種選擇是使用NHibernate映射來指定AUTO-INCREMENT字段,如this answer中的解釋。

  4. 最後,你可以實現一個NHibernate的Interceptor以更新OnSave事件的價值,

    public class IncrementInterceptor : EmptyInterceptor 
    { 
        bool OnSave(object entity, object id, object[] state, 
         string[] propertyNames, IType[] types) 
        { 
         // Increment Customer property value before inserting 
        } 
    } 
    
+0

感謝,當然我們總是可以運行原料/ SQL查詢,但整個點是如果可能的話,退出存儲過程並以NHibernate方式執行操作:( – user1988754

+0

再次感謝您。問題在於,儘管數據庫模式更改不適用於我的情況,因此我必須使用序列表生成序列號,我也不能自動增量的標識類型列(原因在於db的變化) – user1988754

+0

我正在使用MS SQL Server(更具體的SQL Azure沒有序列支持)。據我所知,我們在SQL服務器中用於自動遞增int類型字段的唯一選項是使用IDENTITY列,還是我在這裏丟失了一些東西?謝謝 – user1988754