У меня возникло странное исключение, когда я выполняю запрос nHibernate LINQ. Если я пишу
var address = new Address {Id = Guid.Empty}; session.Query().Where(x=> x == address).ToList();
NHibernate LINQ Query - объект ссылается на несохраненный экземпляр переходного процесса - без сохранения
Чем я
объект ссылается на несохраненный переходный экземпляре - сохранить переходный экземпляр перед промывкой или установить каскадное действие для имущества то, что бы сделать он автосохраняется. Тип: DomainModel.Address, Сущность: DomainModel.Address
на NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved (String EntityName, сущности объекта, ISessionImplementor сессии) на NHibernate.Type.EntityType.GetIdentifier (значение объекта, ISessionImplementor сессия) на NHibernate.Type.ManyToOneType.NullSafeSet (IDbCommand CMD, объект значение индекса, Int32, ISessionImplementor сессия) на NHibernate.Param.NamedParameterSpecification.Bind (IDbCommand команда, IList
1 multiSqlQueryParametersList, Int32 singleSqlParametersOffset, IList
1 sqlQueryParametersList, queryParameters queryParameters, ISessio nImplementor сессии) на команды NHibernate.Param.NamedParameterSpecification.Bind (IDbCommand, IList1 sqlQueryParametersList, QueryParameters queryParameters, ISessionImplementor session) at NHibernate.SqlCommand.SqlCommandImpl.Bind(IDbCommand command, ISessionImplementor session) at NHibernate.Loader.Loader.PrepareQueryCommand(QueryParameters queryParameters, Boolean scroll, ISessionImplementor session) at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet
1 querySpaces, IType [] resultTypes) на сессии NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List (ISessionImplementor, QueryParameters queryParameters) при NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List ( сессии ISessionImplementor, queryParameters queryParameters) в NHibernate.Engine.Query.HQLQueryPlan.PerformList (queryParameters queryParameters, ISessionImplementor сессии, IList результаты) при NHibernate.Impl. SessionImpl.List (IQueryExpression queryExpression, QueryParameters queryParameters, результаты IList) в NHibernate.Impl.AbstractSessionImpl.List (IQueryExpression QueryExpression, параметры QueryParameters) при NHibernate.Impl.ExpressionQueryImpl.List() в NHibernate.Linq.DefaultQueryProvider.ExecuteQuery (NhLinqExpression nhLinqExpression, IQuery запрос, NhLinqExpression nhQuery) в NHibernate .Linq.DefaultQueryProvider.Execute (выражение выражение)
в NHibernate.Linq.DefaultQueryProvider.Execute [TResult] (Expression выражения) при Remotion.Linq.QueryableBase1.GetEnumerator() at System.Linq.Buffer
1..ctor (IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable
1 источник)
Однако, если я пишу
var person = new Person {Id = Guid.Empty}; session.Query().Where(x=> x == person).ToList();
все работает отлично. Единственное различие между двумя классами и связанным отображением состоит в том, что адрес сопоставляется с использованием тега < класса />, в то время как Person принадлежит картографированию наследования, Party => Person и сопоставляется с использованием < присоединенного подкласса />
Я знаю что я могу переписать запрос, используя поля Key, а не объект, однако это только очень упрощенная версия проблемы, и это решение неприменимо.
Идея по этому вопросу?
Спасибо, Marco
Спасибо за быстрый ответ, но как QBE относятся к Linq To nHibernate? я что-то упускаю ? – mCasamento
С вашего вопроса это то, чего вы пытаетесь достичь, используя объект для выполнения запроса. – mathieu
Ну, да, это правильно, но ваше решение подразумевает переход от LINQ к QBE, и, к сожалению, это невозможно в моем сценарии. – mCasamento