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