0

我正在尝试使用Session.Update然后继续执行另一个 SQL 查询来更新实体。另一个查询没有看到更改的值。当我使用分析器跟踪它时,Session.Update什么也没做。

public class InvoiceService()
{
    public void Update(Invoice invoice)
    {
        using (var trans = BeginTransaction())
        {
            Session.Update(invoice); //Nhibernate did not update invoice. 

            ExecuteNamedQuery(); //Query executed before invoice updated.

            trans.Commit(); //Invoice updated.
        }
    }
}

然后我在 Session.Update 之后添加 Session.Flush。

using (var trans = BeginTransaction())
{
    Session.Update(invoice);
    Session.Flush()

    ExecuteNamedQuery();

    trans.Commit();
}

执行后Session.Flush,还会执行更新的 SQL 查询。它完美地工作。执行顺序正确。但后来我执行了另一种方法来获取所有发票。提交事务使 nhibernate 执行更新查询,以便更早地使用旧值更新我更新的发票。(例如:数量 = 20,更新为 10,然后再次更新为 20)

public void FindAll()
{
    using (var trans = BeginTransaction())
    {
        var invoices = Session.CreateCriteria<Invoice>().List<Invoice>();

        trans.Commit(); // In here invoice that i updated earlier get updated again, using old values.

        return invoices;
    }
}

怎么又更新了?

这个问题的解决方案是什么?

提前致谢。

4

1 回答 1

3

Update是该方法的不幸名称;的目的Update是将瞬态实例附加到新会话。请参阅更新文档并确保您了解实例状态

由于 NHibernate 认为发票已更改,因此发票已更新为原始值。此“幻像”更新可能是由意外更改的属性引起的。一个典型的根本原因是一个可以为空的数据库列映射到一个不可为空的属性(反之亦然)。最简单的故障排除方法是dynamic-update在会话工厂配置中打开,以便您可以查看 NHibernate 检测为脏的属性。

于 2012-12-24T16:20:14.570 回答