2010-07-27 2 views
0

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

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

Я не уверен, что Linq для NHibernate поставщика v1 может понять эти типы , Кто-нибудь знает наверняка ? UI'm пытается с источником и не нахожу много радости. Я надеюсь, что кто-то может помочь и показать мне, как это сделать.

А теперь пример .... для данного типа 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(); 

Ошибка:

'свойство не относится к одной колонке: CurrentPrice'

Стек: «свойство не сопоставляется с одной колонки: 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 намного лучше.

+0

Как вы исключили все возможные решения для любого изменения, вам нечего делать. –

+0

Диего - Ты совершенно не понимаешь смысла. Я хочу знать, как это сделать с помощью Linq2NHibernate v1, поскольку это означает, что мне не нужно обновлять версию nHibernate. Мы не хотим этого в Hql, поскольку мы теряем поддержку рефакторинга. – penderi

ответ

0

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

Смежные вопросы