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

发布于 2024-07-11 07:58:26 字数 1124 浏览 5 评论 0原文

我有以下单元测试方法:

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 关系映射的延迟实例化时,所有这些都出现了,并且必须在测试周围添加 using(new SessionScope) 块。

有任何想法吗?

I have the following Unit Test method:

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);
    }
}

As you can see from the comment after the DeleteAndFlush command, I had to change it from a simple Delete to get the Unit test to pass. Why is this? The same is not true for my other unit test for adding an OrderItem. This works just fine:

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);
    }
}

All of this came up when I started using Lazy Instantiation of the Order.OrderItems relationship mapping, and had to add the using(new SessionScope) block around the test.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一张白纸 2024-07-18 07:58:26

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

This is difficult to troubleshoot without knowing the contents of your mappings, but one possibility is that you have the ID property of the OrderItem mapped using an identity field (or sequence, etc.) in the DB. If this is the case, NHibernate must make a trip to the database in order to generate the ID field, so the OrderItem is inserted immediately. This is not true of a delete, so the SQL delete statement isn't executed until session flush.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文