【问题标题】:Nhibernate subsequent read after stored procedure call存储过程调用后休眠后续读取
【发布时间】:2015-10-14 08:16:57
【问题描述】:

我有一个奇怪的 NHibernate 和 ADO.NET 行为。我使用 NHibernate 作为标准 ORM,但使用 ADO.NET 的某些操作更快(例如批处理或调用存储过程)。

所以我正在做以下事情

var item = _items.GetById(100);

然后我确实调用了一个存储过程,它使用以下说明更新同一实体

 var session = _sessionManager.OpenSession();
 using (var tx = session.BeginTransaction())
 {
      var item = _items.GetAll().FirstOrDefault(x => x.ItemCode == code);

      var cmd = session.Connection.CreateCommand();
      session.Transaction.Enlist(cmd);
      cmd.CommandType = CommandType.StoredProcedure;

      SqlParameter id = SQLUtil.GetParam("@bigId", SqlDbType.BigInt, inout: false);

      cmd.CommandText = "storedUpdateItem";
      cmd.Parameters.Add(SQLUtil.GetParam("@tstTS", SqlDbType.Timestamp, inout: false));
      cmd.Parameters.Add(id);

      int ret = cmd.ExecuteNonQuery();
      if (ret != 1)
      {
          throw new ApplicationException("Something gone wrong with update");
      } 
      tx.Commit();

      return _items.GetById(id.Value);
}

因此,使用 NHibernate 存储库再次检索该项目的最后一个操作。问题是该项目未随数据库更新。好像是以前的版本。有什么想法吗?

【问题讨论】:

    标签: c# nhibernate ado second-level-cache


    【解决方案1】:

    您可以使用session 对象的Refresh 方法强制NHibernate 刷新item 的缓存版本:

          ...
          var item = _items.GetById(id.Value);
          session.Refresh(item);
          return item;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-18
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      相关资源
      最近更新 更多