c# - NHibernate 没有获取更改

标签 c# .net nhibernate flush

我想知道以下 NHibernate 代码在什么情况下会失败:

var session = NHibernateSessionManager.CurrentSession;

var foo = session.Linq<Foo>.ToList()[0];

foo.SomeProperty = "test";

session.SaveOrUpdate(foo);

var reloadedFoos = session.Linq<Foo>
                         .Where(x => x.SomeProperty == "test");

Assert.That(reloadedFoos.Count > 0);

Assert 语句总是失败。

如果我在 SaveOrUpdate 之后手动调用 session.Flush,那么 select 查询成功,但是我认为我们不必手动调用 flush?据我了解,NHibernate 应该足够聪明,可以意识到 Foo 已更新,因此第二个选择查询应该会成功。

观察生成的 SQL,似乎第二个选择查询的 SQL 在第一个 SaveOrUpdate 的 SQL 之前执行。

事实上,如果我将整个方法包装在一个事务中,那么它就会成功:

using(NHibernateSessionManager.CurrentSession.BeginTransaction()
{
    // Same code as above
}

现在 SaveOrUpdate 的 sql 将在 Linq.Where sql 之前执行。这有点奇怪,因为我什至不必在两者之间提交事务。

这是怎么回事?

最佳答案

我建议您利用 NHibernate 事务。如果不使用它们,NHibernate 完全有可能无法确定何时发出您的 SaveOrUpdate 调用。

您会发现即使是只读语句在使用事务时也能表现得更好。请看http://nhprof.com/Learn/Alert?name=DoNotUseImplicitTransactions了解更多详情。

例如:

using(var session = NHibernateSessionManager.CurrentSession)
{
  using(var transaction = session.BeginTransaction())
  {
    var foo = session.Linq<Foo>.ToList()[0];

    foo.SomeProperty = "test";

    session.SaveOrUpdate(foo);
    transaction.Commit();
  }
}

关于c# - NHibernate 没有获取更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1452439/

相关文章:

.net - 将 Office 安装到 Windows 容器中(servercore :ltsc2019) failed with error code 17002

c# - 连接字符串内的隔离级别

c# - 带有 MessageBoxes 的 ListView ItemChanged 拼图 - ItemSelectionChanged 调用了两次

c# - 从 C# 调用非托管 (C++) 函数时出现 PInvoke 错误

c# - 在没有 NETCFSvcUtil 生成代理的情况下与 WCF 的 Compact Framework 通信

NHibernate + 并发编辑 : How to get notified of changes?

nhibernate - NHibernate 有没有办法从 View 中通知查询缓存失效?

c# - 如何使自定义 XAML 用户控件可绑定(bind)?

C# While 循环与 For 循环?

c# - 如何将 xaml 中的值绑定(bind)到验证规则?