2

当我执行 nHibernate LINQ 查询时,我遇到了一个奇怪的异常。如果我写
var address = new Address {Id = Guid.Empty}; session.Query().Where(x=> x == address).ToList();

比我得到

对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例或将属性的级联操作设置为使其自动保存的内容。类型:DomainModel.Address,实体:DomainModel.Address

在 NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(String entityName, Object entity, ISessionImplementor session) 在 NHibernate.Type.EntityType.GetIdentifier(Object value, ISessionImplementor session) 在 NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand cmd, Object value, Int32 index , ISessionImplementor session) 在 NHibernate.Param.NamedParameterSpecification.Bind(IDbCommand command, IList 1 multiSqlQueryParametersList, Int32 singleSqlParametersOffset, IList1 sqlQueryParametersList, QueryParameters queryParameters, ISessionImplementor session) 在 NHibernate.Param.NamedParameterSpecification.Bind(IDbCommand command, 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, ISet1 NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) 在 NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) 在 NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) 1 querySpaces, IType[] resultTypes) .Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) at NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression queryExpression, QueryParameters parameters ) 在 NHibernate.Impl.ExpressionQueryImpl.List() 在 NHibernate.Linq.DefaultQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery 查询, NhLinqExpression nhQuery) 在 NHibernate。Linq.DefaultQueryProvider.Execute(表达式表达式)
在 NHibernate.Linq.DefaultQueryProvider.Execute[TResult](表达式表达式)在 Remotion.Linq.QueryableBase 1.GetEnumerator() at System.Linq.Buffer1..ctor(IEnumerable 1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 源)

但是,如果我写
var person = new Person {Id = Guid.Empty}; session.Query().Where(x=> x == person).ToList();

一切正常。这两个类和相关映射的唯一区别是Address使用<class />标签进行映射,而Person属于继承映射,Party => Person使用<joined-subclass />进行映射

我知道我可以使用键字段而不是对象来重写查询,但这只是问题的一个真正简化的版本,这个解决方案不适用。

对这种行为有任何想法吗?

谢谢,马可

4

1 回答 1

0

看看 QBE(按示例查询):

于 2012-05-22T13:48:35.277 回答