NHibernate 3CR1:获取策略问题

时间:2010-11-25 08:08:24

标签: nhibernate linq-to-nhibernate

Continuation to the previous question,我试图以另一种方式避免这个问题:

仅提醒:

  

我的数据库架构如下所述:

     

表格< - >登录

     

< --->> Seller1

     

< --->> Seller2

     

< --->> Seller3

     

我有一个主要实体(表格),一个到   与另一个对象的一个​​关系   (日志)和一对多的关系   孩子们(卖家)。

     

我想要提取所有表格   他们的卖家之一满足   条件。

我现在尝试过这样:

    [Test]
    public void Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd1()
    {
        var CorporationNumber = "513514950";

        var list1 = sellerRepository
                    .Where(x => x.CorporationNumber == CorporationNumber)
                    .Select(x => x.Form)
                    .Fetch(x => x.Log)
                    .Take(10).ToList();

        CollectionAssert.IsNotEmpty(list1);
    }

但不幸的是我得到了NullReferenceException:

  

TestUsingDevelopmentDataBase.Moch.BillOfSale.Data.FormRepositoryTests.Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd1:   System.NullReferenceException:Object   引用未设置为的实例   对象

编辑: stacktrace:

  

在   NHibernate.Linq.Visitors.ResultOperatorProcessors.ProcessFetch.Process(FetchRequestBase   resultOperator,QueryModelVisitor   queryModelVisitor,IntermediateHqlTree   树)   d:\ CSHARP \ NH \的nhibernate \ SRC \ NHibernate的\ LINQ的\访问者\ ResultOperatorProcessors \ ProcessFetch.cs:线   11点   NHibernate.Linq.Visitors.ResultOperatorProcessors.ProcessFetchOne.Process(FetchOneRequest   resultOperator,QueryModelVisitor   queryModelVisitor,IntermediateHqlTree   树)   d:\ CSHARP \ NH \的nhibernate \ SRC \ NHibernate的\ LINQ的\访问者\ ResultOperatorProcessors \ ProcessFetchOne.cs:线   9点   NHibernate.Linq.Visitors.ResultOperatorProcessors.ResultOperatorProcessor 1.Process(ResultOperatorBase resultOperator, QueryModelVisitor queryModel, IntermediateHqlTree tree) in d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\ResultOperatorProcessors\ResultOperatorProcessor.cs:line 17 at NHibernate.Linq.Visitors.ResultOperatorProcessors.ResultOperatorMap.Process(ResultOperatorBase resultOperator, QueryModelVisitor queryModel, IntermediateHqlTree tree) in d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\ResultOperatorProcessors\ResultOperatorMap.cs:line 24 at NHibernate.Linq.Visitors.QueryModelVisitor.VisitResultOperator(ResultOperatorBase resultOperator, QueryModel queryModel, Int32 index) in d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\QueryModelVisitor.cs:line 125 at Remotion.Data.Linq.Clauses.ResultOperatorBase.Accept(IQueryModelVisitor visitor, QueryModel queryModel, Int32 index) at Remotion.Data.Linq.QueryModelVisitorBase.VisitResultOperators(ObservableCollection 1   resultOperators,QueryModel   queryModel)at   Remotion.Data.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel   queryModel)at   NHibernate.Linq.Visitors.QueryModelVisitor.Visit()   在   d:\ CSHARP \ NH \的nhibernate \ SRC \ NHibernate的\ LINQ的\访问者\ QueryModelVisitor.cs:线   96点   NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel   queryModel,VisitorParameters   参数,布尔根)   d:\ CSHARP \ NH \的nhibernate \ SRC \ NHibernate的\ LINQ的\访问者\ QueryModelVisitor.cs:线   49点   NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor   sessionFactory)中   d:\ CSHARP \ NH \的nhibernate \ SRC \ NHibernate的\ LINQ的\ NhLinqExpression.cs:线   67点   NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(字符串   queryIdentifier,IQueryExpression   queryExpression,String   collectionRole,布尔浅,   IDictionary 2 filters, ISessionFactoryImplementor factory) in d:\CSharp\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs:line 27 at NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary 2 enabledFilters,   ISessionFactoryImplementor工厂)   d:\ CSHARP \ NH \的nhibernate \ SRC \ NHibernate的\引擎\查询\ HQLExpressionQueryPlan.cs:线   34点   NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(字符串   expressionStr,IQueryExpression   queryExpression,String   collectionRole,布尔浅,   IDictionary 2 enabledFilters, ISessionFactoryImplementor factory) in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\Query\HQLExpressionQueryPlan.cs:line 23 at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, Boolean shallow, IDictionary 2 enabledFilters,   ISessionFactoryImplementor工厂)   d:\ CSHARP \ NH \的nhibernate \ SRC \ NHibernate的\引擎\查询\ HQLExpressionQueryPlan.cs:线   17点   NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression   queryExpression,布尔浅,   IDictionary的2 enabledFilters) in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\Query\QueryPlanCache.cs:line 88 at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow) in d:\CSharp\NH\nhibernate\src\NHibernate\Impl\AbstractSessionImpl.cs:line 302 at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression) in d:\CSharp\NH\nhibernate\src\NHibernate\Impl\AbstractSessionImpl.cs:line 258 at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery) in d:\CSharp\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line 42 at NHibernate.Linq.NhQueryProvider.Execute(Expression expression) in d:\CSharp\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line 25 at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression) in d:\CSharp\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line 102 at Remotion.Data.Linq.QueryableBase 1.GetEnumerator()   在   System.Collections.Generic.List 1..ctor(IEnumerable 1   收藏)   System.Linq.Enumerable.ToList [TSource](IEnumerable`1   来源)   TestUsingDevelopmentDataBase.Moch.BillOfSale.Data.FormRepositoryTests.Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd1()   在   d:\开发\ NCommon \ Moch.BillOfSale \ Moch.BillOfSale.NHibenate.Tests \ FormRepositoryTests.cs:行   207

问题可以在不太好的情况下规避,如下:

    [Test]
    public void Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd2()
    {
        var CorporationNumber = "513514950";

        var list2 = sellerRepository
                                .Where(x => x.CorporationNumber == CorporationNumber)
                                .Fetch(x => x.Form).ThenFetch(x => x.Log)
                                .Take(10).ToList().Select(x => x.Form);

        CollectionAssert.IsNotEmpty(list2);
    }

但当然我们都更喜欢优雅的方式,并希望了解问题背后的原因

1 个答案:

答案 0 :(得分:0)

我认为Nhibernate不喜欢你在选择后获取。我像你一样遇到了一个空引用异常。

请在此处查看我的问题。

In Linq-to-Nhibernate, is it possible to use .Fetch() after a .Select()?

你可能能够在你的第二个例子中提取之后选择(x => x.Form).ToList()它。

我正在使用Nhibernate 3.2,这仍然是一个问题。应该有一个适当的'你不能在选择'异常后获取或什么东西,以免我们一些痛苦。