gpt4 book ai didi

c# - NHibernate 存储过程返回先前查询的数据

转载 作者:行者123 更新时间:2023-11-30 22:14:36 26 4
gpt4 key购买 nike

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

我两次调用我的方法 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;
}

最佳答案

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

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

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

那么我们该如何解决呢?

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

关于c# - NHibernate 存储过程返回先前查询的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18444388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com