【问题标题】:Using Session.Flush then ITransaction.Commit makes data rollback使用 Session.Flush Transaction.Commit 使数据回滚
【发布时间】:2012-12-24 15:42:01
【问题描述】:

我正在尝试使用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;
    }
}

为什么又要更新了?

有什么办法可以解决这个问题?

提前致谢。

【问题讨论】:

    标签: sql-server nhibernate


    【解决方案1】:

    Update 是该方法的不幸名称; Update 的目的是将瞬态实例附加到新会话。请参阅documentation for update 并确保您了解instance states

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

    【讨论】:

      猜你喜欢
      • 2020-03-28
      • 2014-11-25
      • 2012-04-27
      • 1970-01-01
      • 2015-11-25
      • 2018-10-05
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      相关资源
      最近更新 更多