2010-07-27 54 views
0

我們有一個成熟的nHibernate項目,它已經開始在nHibernate contrib中使用linq提供程序。因爲我們使用的是nHibernate 2.0,所以我們不能在trunk中使用正在開發的新提供者(針對nHibernate 3.0)。使用Linq選擇CompostiteUserTypes到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(); 

錯誤:

'property not map to a single column:CurrentPrice'

Stack: 「屬性不映射到單個列: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) 

注 - 不,我不能用標準和現在沒有HQL不會做,我知道新Linq提供者要好得多。

+0

正如你已經排除了所有可能的解決方案,無論做什麼,都沒有什麼可做的。 – 2010-07-27 11:05:33

+0

迭戈 - 你完全錯過了這一點。我想知道如何通過Linq2NHibernate v1來做到這一點,因爲這意味着我不需要升級nHibernate版本。我們不希望它在Hql中因爲我們失去了重構支持。 – penderi 2010-07-27 12:00:05

回答

0

好吧,我們升級到NH 3.0版,它已經解決 - 可以選擇。