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

时间:2008-12-18 20:29:12

标签: nhibernate activerecord flush

我有以下单元测试方法:

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中更改它以使Unit测试通过。为什么是这样?添加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关系映射的Lazy Instantiation时,所有这些都出现了,并且必须在测试周围添加using(新的SessionScope)块。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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