Выбор CompostiteUserTypes с помощью Linq To nHibernate (v1) - PullRequest
0 голосов
/ 27 июля 2010

У нас есть зрелый проект nHibernate, который начал использовать провайдера linq в nHibernate contrib. Поскольку мы используем nHibernate 2.0, мы не можем использовать новый разрабатываемый провайдер в транке (против nHibernate 3.0).

Несмотря на ограниченность, он оказался идеальным для наших нужд, за исключением одной проблемы - всякий раз, когда я выбираю CompositeUserType, я получаю ошибку ''

Я не уверен, что провайдер Linq to nHibernate v1 может понимать эти типы. Кто-нибудь знает наверняка ? Я пытаюсь с источником и не нахожу много радости. Я надеюсь, что кто-то может помочь и показать мне, как.

А теперь пример .... для данного типа ActiveRecord ...

[ActiveRecord]
public class Product : IHoldPrice
{
       [PrimaryKey(PrimaryKeyType.Guid)]
       public virtual Guid Key { get; set; }

       [Property(NotNull = true, Length = 250)]
       public virtual string Name { get; set;}

       [CompositeUserType(typeof (PriceUserType), new[] {"Price_Value", "Price_DateChanged"})]
       public virtual IPrice CurrentPrice { get; set; }
}

Когда я пытаюсь сделать следующее утверждение, я получаю сообщение об ошибке:

(from p in Session.Linq<Product>()
              .Where(p => p.Key == productKey)
              .Select(p => new
                  {
                      p.Key,
                      p.CurrentPrice
                  }))
              .FirstOrDefault();

Ошибка:

свойство does не отображается в один столбец: CurrentPrice ’

Stack: ‘Свойство не отображается в один столбец: CurrentPrice’

Stack:

NHibernate.QueryException: property does not map to a single column: CurrentPrice
   at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumn(ICriteria criteria, String propertyName)
   at NHibernate.Criterion.PropertyProjection.ToSqlString(ICriteria criteria, Int32 loc, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters)
   at NHibernate.Criterion.ProjectionList.ToSqlString(ICriteria criteria, Int32 loc, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters)
   at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetSelect(IDictionary`2 enabledFilters)
   at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary`2 enabledFilters)
   at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary`2 enabledFilters)
   at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
   at NHibernate.Impl.CriteriaImpl.List(IList results)
   at NHibernate.Impl.CriteriaImpl.List[T]()
   at NHibernate.Linq.Visitors.ImmediateResultsVisitor`1.GetElementList(MethodCallExpression call, Int32 count)
   at NHibernate.Linq.Visitors.ImmediateResultsVisitor`1.HandleFirstOrDefaultCall(MethodCallExpression call)
   at NHibernate.Linq.Visitors.ImmediateResultsVisitor`1.VisitMethodCall(MethodCallExpression call)
   at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)
   at NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression exp)
   at NHibernate.Linq.Visitors.ImmediateResultsVisitor`1.GetResults(MethodCallExpression expr)
   at NHibernate.Linq.Visitors.RootVisitor.HandleImmediateResultsCall(MethodCallExpression call)
   at NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression expr)
   at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)
   at NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression exp)
   at NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(Expression expression, QueryOptions queryOptions)
   at NHibernate.Linq.NHibernateQueryProvider.TranslateExpression(Expression expression)
   at NHibernate.Linq.NHibernateQueryProvider.Execute(Expression expression)
   at NHibernate.Linq.QueryProvider.System.Linq.IQueryProvider.Execute[T](Expression expression)
   at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)

Примечание. Нет, я не могу использовать критерии, и Hql сейчас не подойдет, и я знаю, что новый поставщик Linq намного лучше.

1 Ответ

0 голосов
/ 20 июня 2011

Хорошо, мы обновились до NH v3.0, и это решено - можете выбрать.

...