2014-02-28 40 views
0

我使用NHibernate 3.2.0.4000,SQL Server 2012,C#.NET 4.0 MVC。在單個數據庫調用中執行單行NHibernate Save和HQL刪除與子查詢的混合

我有一個NHibernate會話,其中A類對象是Save'd,HQL delete語句是針對B類對象執行的。

調試級別的日誌記錄顯示...從MyDb.MySchema.ClassB

DEBUG NHibernate.SQL刪除...
DEBUG NHibernate.AdoNet.AbstractBatcher的ExecuteNonQuery花了5毫秒
DEBUG NHibernate.Transaction .AdoTransaction開始提交
DEBUG NHibernate.AdoNet.AbstractBatcher添加到批:INSERT INTO MyDb.MySchema.ClassA ...
DEBUG NHibernate.AdoNet.AbstractBatcher則ExecuteBatch 1只陳述了6毫秒

SQL事件探查器將2條語句顯示爲2個單獨的遠程過程調用RPC:Completed事件的一部分。

以上對具有1條語句和分析器數據的批處理的日誌引用似乎表明2條語句正在兩個獨立的數據庫調用中執行。如何將這兩個語句組合成一個數據庫調用,就像在使用Future和FutureValue時使用select語句一樣?

一些額外的細節,可以幫助是:提前對所有試圖幫助

//The NHibernate Insert code 
ClassADao.Save(new ClassA()); 

//The HQL delete code 
session.CreateQuery 
( 
    "delete from Solution.Project.Classes.ClassB as classB " + 
    "where exists (" + 
     "from Solution.Project.Classes.ClassC as classC " + 
     "where classC.classD_FK.Id = :classD_FK_Id_One " + 
     "and classC = classB.classC_FK " + 
     "and classB.classD_FK.Id = :classD_FK_Id_Two " + 
    ") " 
) 
.SetInt32("classD_FK_Id_One", Id1) 
.SetInt32("classD_FK_Id_Two", Id2) 
.ExecuteUpdate(); 

//The DEBUG level logged translation of the above HQL delete statement 
delete from MyDb.MySchema.CLASSB 
where exists ( 
    select CLASSC1_.id 
    from MyDb.MySchema.CLASSC CLASSC1_ 
    where CLASSC1_.classd_id = @p0 
    and classc_id = MyDb.MySchema.CLASSB.classc_id 
    and MyDb.MySchema.CLASSB.classd_id = @p1 
); 

//and the fact that I'm using adonet.batch_size value of 5.` 

感謝。

回答

0

adonet.batch_size不會創建單個sp_executesql命令。這是不可能的,因爲sp_executesql是由NHibernate創建的,而ado.net是在後臺批量生成的。

實際上,您沒有看到使用SQL Profiler的ado.net批處理。它使用多個命令創建單個服務器調用,這些命令都與Profiler分開顯示。

+0

好的。我很難確認這是否屬實。我假設一個ADO批處理意味着一個數據庫調用,對嗎?因爲在profiler中,儘管我看不到ADO批處理,但我可以看到每條語句都生成了一個單獨的,不同的RPC類型事件:Completed,(RPC - > remote procedure call),並且我錯誤地假設了? 2個不同的RPC:完成的事件表示它們是2個不同的數據庫調用,因此它們有1個以上的ADO批次。 –

+0

它可能不會將Flush(在查詢之前)和查詢集中到一個批處理中。 –