使用Linq To nHibernate选择CompostiteUserTypes(v1)

时间:2010-07-27 08:30:06

标签: nhibernate linq-to-nhibernate compositeusertype

我们已经开始在nHibernate contrib中使用linq提供程序的成熟nHibernate项目。当我们使用nHibernate 2.0时,我们不能在trunk中使用正在开发的新提供程序(针对nHibernate 3.0)。

虽然限制它被证明是一个完美的满足我们的需求,除了一个问题 - 每当我选择一个CompositeUserType我得到一个错误''

我不确定Linq to 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'

堆栈:

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)

注意 - 不,我不能使用Criteria,现在没有Hql不会做,我知道新的Linq提供商要好得多。

1 个答案:

答案 0 :(得分:0)

好的,我们升级到NH v3.0并且它已经解决了 - 可以选择。