【问题标题】:NHibernate 3CR1: Fetching strategy problemsNHibernate 3CR1:获取策略问题
【发布时间】:2010-11-25 08:08:24
【问题描述】:

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

只是为了提醒:

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

表格日志

>卖家1

>卖家2

>卖家3

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

我想取出所有的表格 他们的卖家之一满足某些 条件。

我现在这样尝试:

    [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:对象 引用未设置为 对象

编辑:堆栈跟踪:

在 NHibernate.Linq.Visitors.ResultOperatorProcessors.ProcessFetch.Process(FetchRequestBase resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree 树)在 d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\ResultOperatorProcessors\ProcessFetch.cs:line 11 点 NHibernate.Linq.Visitors.ResultOperatorProcessors.ProcessFetchOne.Process(FetchOneRequest resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree 树)在 d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\ResultOperatorProcessors\ProcessFetchOne.cs:line 9 在 NHibernate.Linq.Visitors.ResultOperatorProcessors.ResultOperatorProcessor1.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(ObservableCollection1 结果运算符,查询模型 查询模型)在 Remotion.Data.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel 查询模型)在 NHibernate.Linq.Visitors.QueryModelVisitor.Visit() 在 d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\QueryModelVisitor.cs:line 96 在 NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel 查询模型、访客参数 参数,布尔根)在 d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\QueryModelVisitor.cs:line 49 在 NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor 会话工厂)在 d:\CSharp\NH\nhibernate\src\NHibernate\Linq\NhLinqExpression.cs:line 67 在 NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(字符串 查询标识符,IQueryExpression 查询表达式,字符串 collectionRole,布尔浅层, IDictionary2 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, IDictionary2 enabledFilters, ISessionFactoryImplementor 工厂)在 d:\CSharp\NH\nhibernate\src\NHibernate\Engine\Query\HQLExpressionQueryPlan.cs:line 34 在 NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(字符串 表达式Str,IQueryExpression 查询表达式,字符串 collectionRole,布尔浅层, IDictionary2 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, IDictionary2 enabledFilters, ISessionFactoryImplementor 工厂)在 d:\CSharp\NH\nhibernate\src\NHibernate\Engine\Query\HQLExpressionQueryPlan.cs:line 17 在 NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression,布尔浅层, IDictionary2 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.QueryableBase1.GetEnumerator() 在 System.Collections.Generic.List1..ctor(IEnumerable1 集合)在 System.Linq.Enumerable.ToList [TSource](IEnumerable`1 来源)在 TestUsingDevelopmentDataBase.Moch.BillOfSale.Data.FormRepositoryTests.Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd1() 在 D:\Dev\NCommon\Moch.BillOfSale\Moch.BillOfSale.NHibenate.Tests\FormRepositoryTests.cs:line 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);
    }

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

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?
  • 如果有的话,NH 应该抛出比 NRE 更具体的异常。您可以创建测试用例并将其提交给 NH Jira 吗?
  • @ari:尝试创建一个 独立 测试用例来重现问题,否则开发人员可能不会查看它。
  • 在使用 NHibernate 的最新通用版本时是否仍然会出现这种情况? (RC 版本通常存在内部实现错误;发布 (GA) 版本通常更稳定。)

标签: nhibernate linq-to-nhibernate


【解决方案1】:

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

在这里查看我的问题。

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

您也可以在 .ToList() 之前在第二个示例中获取之后进行 .Select(x => x.Form)。

我正在使用 Nhibernate 3.2,这仍然是一个问题。应该有一个适当的“您在选择后无法获取”异常或让我们免于痛苦的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2011-05-05
    • 2013-07-24
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多