当我执行nHibernate LINQ查询时,我有一个奇怪的异常 . 如果我写var address = new Address {Id = Guid.Empty}; session.Query().Where(x=> x == address).ToList();
比我得到的
object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例,或者将属性的级联操作设置为使其自动保存的操作 . 键入:DomainModel.Address,Entity:NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(String entityName,Object entity,ISessionImplementor session)中的DomainModel.Address,位于NHibernate.Type.ManyToOneType的NHibernate.Type.EntityType.GetIdentifier(Object value,ISessionImplementor session) NHibernate.Param.NamedParameterSpecification.Bind上的NHibernate.Param.NamedParameterSpecification.Bind(IDbCommand命令,IList1 multiSqlQueryParametersList,Int32 singleSqlParametersOffset,IList1 sqlQueryParametersList,QueryParameters queryParameters,ISessionImplementor session)中的.NullSafeSet(IDbCommand cmd,Object value,Int32 index,ISessionImplementor session) (IDbCommand命令,IList1 sqlQueryParametersList,QueryParameters queryParameters,ISessionImplementor会话)NHibernate.SqlCommand.SqlCommandImpl.Bind(IDbCommand命令,ISessionImplementor会话)在NHibernate.Loader.Loader.PrepareQueryCommand(QueryParameters queryParameters,Boolean scroll,ISessionImplementor s) ession)NHibernate.Loader.DoQuery(ISessionImplementor session,QueryParameters queryParameters,Boolean returnProxies)NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session,QueryParameters queryParameters,Boolean returnProxies)NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)NHibernate.Loader.Loader.List上的NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session,QueryParameters queryParameters)(ISessionImplementor session,QueryParameters queryParameters,ISet1 querySpaces,IType [] resultTypes)NHibernate.Hql.Ast.ANTLR . 位于NHibernate.Engine.Query.HQLQueryPlan.PerformList的NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session,QueryParameters queryParameters)中的Loader.QueryLoader.List(ISessionImplementor session,QueryParameters queryParameters)(QueryParameters queryParameters,ISessionImplementor session,IList结果) )在NHibernate.Impl在NHibernate.Linq.DepaultQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression)的NHibernate.Impl.ExpressionQueryImpl.List()NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression queryExpression,QueryParameters参数)中的.SessionImpl.List(IQueryExpression queryExpression,QueryParameters queryParameters,IList results) ,IQuery查询,NhLinqExpression nhQuery)NHibernate.Linq.DefaultQueryProvider.Execute(表达式表达式),位于System.Linq.Buffer1的Remotion.Linq.QueryableBase1.GetEnumerator()的NHibernate.Linq.DefaultQueryProvider.Execute [TResult](表达式表达式) System.Linq.Enumerable.ToArray [TSource](IEnumerable1 source)中的..ctor(IEnumerable1源代码)
但是,如果我写var person = new Person {Id = Guid.Empty}; session.Query().Where(x=> x == person).ToList();
一切正常 . 两个类和相关映射之间的唯一区别是,Address使用<class />标记进行映射,而Person属于继承映射,Party => Person并使用<joined-subclass />进行映射
我知道我可以使用Key字段而不是对象重写查询,但这只是问题的真正简化版本,并且此解决方案不适用 .
对这种行为有什么想法吗?
谢谢,马可
1 回答
看看QBE(按示例查询):
NHibernate : Query by example on primary key produces "WHERE (1=1)"
Mixing Likes and Equals with NHibernate Query-By-Example?