使用ActiveRecord/NHibernate,我可以在不刷新的情况下删除和刷新吗?

使用ActiveRecord/NHibernate,我可以在不刷新的情况下删除和刷新吗?,nhibernate,activerecord,flush,Nhibernate,Activerecord,Flush,我有以下单元测试方法: void TestOrderItemDelete() { using (new SessionScope()) { var order = Order.FindById(1234); var originalItemCount = order.OrderItems.Count; Assert.IsTrue(originalCount > 0); var itemToDelete = or

我有以下单元测试方法:

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命令后的注释中可以看到,我不得不将其从简单的Delete更改为使单元测试通过。为什么会这样?对于添加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关系映射的惰性实例化,并且不得不在测试中添加using(new SessionScope)块时,所有这些都出现了


有什么想法吗?

如果不知道映射的内容,就很难排除故障,但有一种可能性是,您使用数据库中的标识字段(或序列等)映射了OrderItem的ID属性。如果是这种情况,NHibernate必须访问数据库以生成ID字段,因此OrderItem将立即插入。delete不是这样,所以SQL delete语句在会话刷新之前不会执行