【问题标题】:Using ActiveRecord/NHibernate, can I Delete and Refresh without a Flush?使用 ActiveRecord/NHibernate,我可以在不刷新的情况下删除和刷新吗?
【发布时间】:2008-12-18 20:29:11
【问题描述】:

我有以下单元测试方法:

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) 块。

有什么想法吗?

【问题讨论】:

    标签: nhibernate activerecord flush


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 2012-10-31
      • 2010-09-20
      • 1970-01-01
      • 2015-11-13
      • 2013-10-30
      • 2021-12-22
      相关资源
      最近更新 更多