NHibernate 3CR1: извлечение проблем со стратегией - PullRequest
4 голосов
/ 25 ноября 2010

Продолжение предыдущего вопроса , я попытался избежать проблемы другим способом:

Только для напоминания:

Моя схема базы данных описана ниже:

Форма <-> Журнал

<--- >> 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: объект ссылка не установлена ​​на экземпляр объект

РЕДАКТИРОВАТЬ: трассировки стека:

в 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) в Remotion.Data.Linq.QueryModelVisitorBase.VisitQueryModel (QueryModel queryModel) в 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 (String 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 factory) в d: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Engine \ Query \ HQLExpressionQueryPlan.cs: строка 34 в NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor (String 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 factory) в d: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Engine \ Query \ 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: \ Dev \ 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 голосов
/ 28 февраля 2012

Я думаю, что Nhibernate не нравится, когда вы выбираете после выбора.Я столкнулся с исключением нулевой ссылки, как и вы.

См. Мой вопрос здесь об этом.

В Linq-to-Nhibernate возможно ли использовать .Fetch ()после .Select ()?

Возможно, вы сможете .Select (x => x.Form) после извлечения во втором примере перед ним .ToList () тоже.

Я использую Nhibernate 3.2, и это все еще проблема.Должно быть правильное «вы не можете получить после выбора» исключение или что-то, что избавит нас от боли.

...