【问题标题】:NHibernate stored procedure returns data from previous queryNHibernate 存储过程从先前的查询返回数据
【发布时间】:2013-08-26 12:42:21
【问题描述】:

我使用两个存储过程,它们返回具有相同结构的数据(相同类型的记录列表)。

我两次调用我的方法 Execute(ISession session)。第一个存储过程的第一次(它返回正确的 6 行列表)。第二次 - 对于第二个存储过程(它返回 11 行的列表,但前 6 行来自覆盖正确行的第一个请求)。

我发现 Impact on NHibernate caching for searches with results including calculated value mapped as a formula (e.g. rank)

但我不能将它用于 IQuery

任何想法或链接如何修复它?

public dynamic Execute(ISession session)
{
    var query = session.GetNamedQuery(QueryName)
        .SetCacheable(false)
        .SetCacheMode(CacheMode.Ignore)
        .SetReadOnly(true);
    var results = query.List<T>();
    return results;
}

【问题讨论】:

  • 你能发布两个有问题的查询的 HQL 吗?
  • 抱歉,没有HQL,存储过程位于SQL server上

标签: c# sql nhibernate stored-procedures


【解决方案1】:

我将尝试回答这个问题,因为我想我对正在发生的事情有预感,我想让你走上正轨。我在这里做了很多假设,所以如果我的猜测完全错误,请不要对我太苛刻。

感觉就像您在尝试使用 NHibernate 作为工具来简单地将行转换为对象。相反,NHibernate 是一个在您的面向对象领域模型和您的关系数据库领域模型之间进行转换的工具。它所做的更多只是将行变成对象。特别是,您在这里遇到的 NHibernate 特性是 NHibernate 如何确保在单个 NHibernate 会话中,表示单个实体的数据库中的单个行将对应于对象的单个实例。它使用其一级缓存来完成此操作。

假设您有两个查询,QueryA 和 QueryB。这些查询的构造使得它们每个都从单独的表 TableA 和 TableB 中提取,因此它们实际上代表了单独的实体。然而,查询也以某种方式构建,以便结果在 NHibernate 中看起来像同一个实体。如果 QueryA 和 QueryB 碰巧返回了一些相同的 id,那么 NHibernate 会将它们组合到同一个实例中,因此当您运行 QueryB 时,您会看到 QueryA 的一些结果重复。

那么我们该如何解决呢?

快速而肮脏的解决方法是为这两个查询中的每一个使用不同的会话,或者在它们之间抛出一个session.Clear()。更合适的解决方法是更改​​这些命名查询,以便它们确实返回两​​个不同的实体。

【讨论】:

  • session.Clear() 没有帮助。我无法更改 SP,但我可以更改数据映射到的类。我创建了两个具有相同字段的类,用于映射到两个的每个查询。我明白,这不是最好的解决方案,但它有效。谢谢你的回答。
【解决方案2】:

我有同样的问题,首先我用session.Clear() 解决了这个问题,但是这个解决方案导致了另一个错误。我阅读了 Daniel 的回复,我的回复是为了检测到问题出在存储过程中,存储过程没有返回唯一标识符,当我使用 nhibernate 映射 ID 时产生了错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多