Nhibernate 连接查询的二级缓存问题

Nhibernate 连接查询的二级缓存问题,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我想使用第二级缓存来处理带有急切加载的查询(下面用3种不同的方式编写查询,我使用查询缓存)。我有标准的一对多协会。我为父级、子级以及父级和类之间的关联设置实体缓存。二级缓存不工作,因为我有异常 我用3种不同的方式编写了我的查询: 标准: session.CreateCriteria<DictionaryMaster>().SetFetchMode("DictionaryItems", FetchMode.Eager) .SetResultTransf

我想使用第二级缓存来处理带有急切加载的查询(下面用3种不同的方式编写查询,我使用查询缓存)。我有标准的一对多协会。我为父级、子级以及父级和类之间的关联设置实体缓存。二级缓存不工作,因为我有异常

我用3种不同的方式编写了我的查询:
标准:

 session.CreateCriteria<DictionaryMaster>().SetFetchMode("DictionaryItems", FetchMode.Eager)
                .SetResultTransformer(new DistinctRootEntityResultTransformer())
                .SetCacheable(true).SetCacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();
session.CreateCriteria().SetFetchMode(“DictionaryItems”,FetchMode.Eager)
.SetResultTransformer(新DistincTrotentyResultTransformer())
.SetCacheable(true).SetCacheMode(CacheMode.Normal)
.List().ToList();
调用此查询时,出现异常“无法执行查找[SQL:SQL不可用]” 我认为问题的存在是因为我使用DistincTrotentyResultTransformer变换。我将开始创建我的自定义转换类,我希望这会起作用


查询:

 session.QueryOver<DictionaryMaster>().Fetch(x => x.DictionaryItems).Eager
                    .TransformUsing(new DistinctRootEntityResultTransformer())
                    .Cacheable().CacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();
session.QueryOver().Fetch(x=>x.DictionaryItems).Eager
.TransformUsing(新的DistinctRootEntityResultTransformer())
.Cacheable().CacheMode(CacheMode.Normal)
.List().ToList();
例外情况与条件中的相同

林克:

session.Query().Fetch(x=>x.DictionaryItems.Cacheable().CacheMode(CacheMode.Normal).ToList();
这里的错误取决于nhibernate在3.1中的版本a得到了这个错误 但在3.2版本中,我得到了以下信息:


提前谢谢你,我已经找到了解决办法,但对我来说,这更像是权宜之计。因此,如果您知道任何其他解决方案,请给我签名。
我使用QueryOver而不进行任何转换,这个解决方案的缺点是查询返回的元素等于child的数量。接下来,我使用distinct检索内存中的非相乘列表
这个解决方案还可以,但当我们为查询添加一个Fetch时,对象中的集合也会成倍增加,这就是为什么我将集合类型从IList(Bag)修改为ISet(Set)


代码如下所示:

var queryCacheResult =
                session.QueryOver<DictionaryMaster>()
                .Fetch(x => x.DictionaryItems).Eager
                    .Cacheable().CacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();

            return queryCacheResult.Distinct(new KeyEqualityComparer<DictionaryMaster>(x => x.Code)).ToList();
var queryCacheResult=
session.QueryOver()
.Fetch(x=>x.DictionaryItems).Eager
.Cacheable().CacheMode(CacheMode.Normal)
.List().ToList();
返回queryCacheResult.Distinct(新的KeyEqualityComparer(x=>x.Code)).ToList();

您说您怀疑错误是由结果转换器引起的。你试过移除它,看看会发生什么吗<代码>SQL不可用是一个非常常见的错误。是否在某个地方没有进一步的细节/内部异常?是的,当我移除结果转换器时,一切都正常(nHibernate 3.1)。我没有得到任何错误,解决方案放在下面。如果你愿意,我可以为你准备一些测试项目。
var queryCacheResult =
                session.QueryOver<DictionaryMaster>()
                .Fetch(x => x.DictionaryItems).Eager
                    .Cacheable().CacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();

            return queryCacheResult.Distinct(new KeyEqualityComparer<DictionaryMaster>(x => x.Code)).ToList();