Sql server 使用Session.Flush然后使用ITransaction.Commit使数据回滚

Sql server 使用Session.Flush然后使用ITransaction.Commit使数据回滚,sql-server,nhibernate,Sql Server,Nhibernate,我正在尝试使用会话更新实体。更新然后继续执行另一个SQL查询。另一个查询没有看到更改的值。当我使用探查器跟踪它时,Session.Update什么也没做 public class InvoiceService() { public void Update(Invoice invoice) { using (var trans = BeginTransaction()) { Session.Update(invoice); /

我正在尝试使用
会话更新实体。更新
然后继续执行另一个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()
{
使用(var trans=BeginTransaction())
{
var发票=Session.CreateCriteria().List();
trans.Commit();//在这里,我先前更新的发票将使用旧值再次更新。
退回发票;
}
}
为什么会再次更新?

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


提前感谢。

Update
是该方法的一个不幸名称;
Update
的目的是将临时实例附加到新会话。查看并确保您理解


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

更新
是该方法的一个不幸名称;
Update
的目的是将临时实例附加到新会话。查看并确保您理解

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

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