Проекция Nhibernate queryover на поля подробных сущностей

Что я хочу сделать, так это иметь возможность использовать проекции с запросом. Мне удалось сделать это, используя проекции на первом уровне только с помощью AliasToBean Transformer, но когда я проецирую свойства из класса деталей, nhibenate выдает следующее исключение:

 Could not find a setter for property 'FirstContact' in class 'Model.Personnel.Entities.Employee'
 at NHibernate.Properties.ChainedPropertyAccessor.GetSetter(Type theClass, String propertyName)
 at NHibernate.Transform.AliasToBeanResultTransformer.TransformTuple(Object[] tuple, String[] aliases)
 at NHibernate.Loader.Criteria.CriteriaLoader.GetResultList(IList results, IResultTransformer customResultTransformer)
 at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
 at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
 at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session)
 at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
 at NHibernate.Impl.CriteriaImpl.List(IList results)
 at NHibernate.Impl.CriteriaImpl.List[T]()
 at NHibernate.Criterion.QueryOver`1.List[U]()
 at NHibernate.Criterion.QueryOver`1.NHibernate.IQueryOver<TRoot>.List[U]()
 at Tests.Entities.EmployeeFacts.QueryEmployees()

Это мой текущий код:

Employee anEmployee = null;
Contact aContact = null;

session.QueryOver(() => anEmployee).Left
                .JoinAlias(() => anEmployee.Contact, () => aContact)
                .OrderBy(() => aGender.Name).Asc
                .ThenBy(() => aContact.FirstContact).Asc
                .SelectList(builder => builder.Select(() => aContact.FirstContact)
                                              .WithAlias(() => aContact.FirstContact)
                                              .Select(() => anEmployee.FirstName)
                                              .WithAlias(() => anEmployee.FirstName))
                .TransformUsing(Transformers.AliasToBean(typeof(Employee)))
                .List<Employee>();

person Manar Husrieh    schedule 12.06.2012    source источник
comment
Вы должны проецировать на какой-то DTO, содержащий только те поля, которые вам нужны, вместо того, чтобы пытаться проецировать на сам объект.   -  person Andrew Whitaker    schedule 12.06.2012
comment
@AndrewWhitaker Проблема в том, что мой код динамический, это всего лишь пример, и я пытаюсь создать шаблон, чтобы сгенерировать его с помощью динамического кода. Есть ли способ сделать это с существующими трансформаторами или я должен построить свой собственный трансформатор?!!   -  person Manar Husrieh    schedule 13.06.2012


Ответы (1)


Для вашего списка выбора все методы WithAlias должны использовать один и тот же dto, и это также должен быть тот же класс, который используется в преобразователе. Кроме того, я не знаю, почему вы проецируете на отображаемый объект? Проекции для плоского dto.

Эта ошибка, которую вы видите, связана с тем, что недопустимый преобразователь .WithAlias(() => aContact.FirstContact)...NH теперь ожидает свойство FirstContact внутри класса Employee. Решение состоит в том, чтобы создать один dto, содержащий свойства FirstContact и FirstName, и использовать его для преобразователя WithAlias ​​и AliasToBean.

person dotjoe    schedule 15.06.2012