2008-12-18 27 views
0

我有以下的單元測試方法:使用ActiveRecord/NHibernate,我可以刪除和刷新沒有沖洗?

void TestOrderItemDelete() 
{ 
    using (new SessionScope()) 
    { 
     var order = Order.FindById(1234); 
     var originalItemCount = order.OrderItems.Count; 
     Assert.IsTrue(originalCount > 0); 
     var itemToDelete = order.OrderItems[0]; 
     itemToDelete.DeleteAndFlush(); // itemToDelete.Delete(); 
     order.Refresh(); 
     Assert.AreEqual(originalCount - 1, order.OrderItems.Count); 
    } 
} 

正如你可以從DeleteAndFlush命令後的評論看,我不得不把它從一個簡單的刪除更改獲取單元測試通過。爲什麼是這樣?對於添加OrderItem的其他單元測試,情況也是如此。這只是正常:

void TestOrderItemAdd() 
{ 
    using (new SessionScope()) 
    { 
     var order = Order.FindById(1234); 
     var originalItemCount = order.OrderItems.Count; 
     var itemToAdd = new OrderItem(); 
     itemToAdd.Order = order; 
     itemToAdd.Create(); // Notice, this is not CreateAndFlush 
     order.Refresh(); 
     Assert.AreEqual(originalCount + 1, order.OrderItems.Count); 
    } 
} 

所有這一切都來了,當我開始使用Order.OrderItems關係映射的延時實例,並且必須添加周圍的測試使用(新SessionScope)塊。

任何想法?

回答

1

如果不知道映射的內容,這很難排除故障,但有一種可能性是,您具有使用數據庫中的標識字段(或序列等)映射的OrderItem的ID屬性。如果是這種情況,NHibernate必須跳過數據庫才能生成ID字段,因此OrderItem會立即插入。這不是真的刪除,所以SQL刪除語句不會執行,直到會話刷新。