我們有一個成熟的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提供者要好得多。
正如你已經排除了所有可能的解決方案,無論做什麼,都沒有什麼可做的。 – 2010-07-27 11:05:33
迭戈 - 你完全錯過了這一點。我想知道如何通過Linq2NHibernate v1來做到這一點,因爲這意味着我不需要升級nHibernate版本。我們不希望它在Hql中因爲我們失去了重構支持。 – penderi 2010-07-27 12:00:05