【发布时间】:2016-12-09 13:47:26
【问题描述】:
我有一个实体:
public class SalesUnit
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }
}
及相关Dto:
public class SalesUnitDto
{
public long Id { get; set; }
public string Name { get; set; }
}
我有一个非常简单的查询:
SalesUnitDto result = null;
var list = _session.QueryOver<SalesUnit>()
.SelectList(l => l
.Select(x => x.Id).WithAlias(() => result.Id)
.Select(x => x.Name).WithAlias(() => result.Name))
.TransformUsing(Transformers.AliasToBean<SalesUnitDto>())
//.Cacheable()
.List<SalesUnitDto>();
在我插入二级缓存之前,它一直在工作。因此,如果我取消注释 Cacheable() 行,我将得到异常:
消息:值不能为空。参数名称:别名 堆栈跟踪:
at NHibernate.Transform.AliasedTupleSubsetResultTransformer.IncludeInTransform(String[] aliases, Int32 tupleLength)
at NHibernate.Transform.CacheableResultTransformer.Create(ITupleSubsetResultTransformer transformer, String[] aliases, Boolean[] includeInTuple)
at NHibernate.Loader.Loader.GenerateQueryKey(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.ListUsingQueryCache(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
那有什么问题呢?它是 NHibernate 的错误吗? 我尝试了不同的提供商,但无济于事。我也尝试像这样创建 CacheableResultTransformer:
CacheableResultTransformer.Create(Transformers.AliasToBean<SalesUnitDto>(), new[] { "Id", "Name" }, new[] { true, true })
它可以返回和缓存数据,但只能作为元组(对象[])。我没有设法返回 Dto。
这是演示问题的工作示例:github
【问题讨论】:
-
result是如何声明的? -
@Andrew Whitaker,
result是SalesUnitDto -
无法复制 - 使用或不使用
Cacheable()。 NH v4.0.4.4000 -
我也在使用 NH v4.0.4.4000!能否依赖 Fluent 配置或 CacheProvider?
-
不知道。如果您可以提供完整的 repro 项目或其他内容(例如 Is it possible to fetch a link table without fetching all links? 帖子中的 OP),将看看发生了什么。
标签: c# caching nhibernate nhibernate-caches resulttransformer