У меня есть сущность:Nhibernate второго уровня кэша с AliasesToBean трансформатора
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()
, я получу исключение:
Сообщение: Значение не может быть равно нулю. Имя параметра: псевдонимами StackTrace:
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 })
Он может вернуться и кэш данных, но только в качестве кортежей (Object []). Я не смог вернуть Дто.
Вот рабочий пример, чтобы продемонстрировать проблему: github
Как объявляется «результат»? –
@Andrew Whitaker, 'result' is' SalesUnitDto' –
Невозможно воспроизвести - работает с или без 'Cacheable()'. NH v4.0.4.4000 –