2012-05-22 29 views
2

當我執行一個nHibernate的LINQ查詢時,我有一個奇怪的異常。 如果我寫
var address = new Address {Id = Guid.Empty}; session.Query().Where(x=> x == address).ToList();
NHibernate的LINQ查詢 - 對象引用一個未保存的瞬態實例 - 不保存

比我得到

對象引用一個未保存的瞬態的實例 - 沖洗前的短暫 實例或設置級聯行動財產保存到 的東西,這將使它自動保存。類型:DomainModel.Address, 實體:DomainModel.Address

在 NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(字符串 的entityName,對象實體,ISessionImplementor會議)在 NHibernate.Type.EntityType.GetIdentifier(對象的值, ISessionImplementor會話)在 NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand的CMD,在 NHibernate.Param.NamedParameterSpecification.Bind(對象 值,的Int32索引,ISessionImplementor會話)IDbCommand的命令, IList的1 multiSqlQueryParametersList, Int32 singleSqlParametersOffset, IList 1個sqlQueryParametersList,queryParameters queryParameters, ISES sionImplementor會話)在 NHibernate.Param.NamedParameterSpecification.Bind(IDbCommand的命令, IList的1 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 在 NHibernate.Engine.Query.HQLQueryPlan.PerformList(在 NHibernate.Impl queryParameters queryParameters,ISessionImplementor會話,IList的結果)會話,queryParameters queryParameters)。 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](式 表達)在Remotion.Linq.QueryableBase 1.GetEnumerator() at System.Linq.Buffer 1..ctor(IEnumerable的1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable 1源)

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

一切工作正常。兩個類和相關的映射之間的唯一區別是,地址是使用<類/>標記而人屬於一個繼承映射,甲方=>人映射並且使用<接合子類/>

我知道被映射我可以使用Key字段而不是對象重寫查詢,但這只是問題的一個真正簡化的版本,並且此解決方案不適用。

關於這種行爲的任何想法?

感謝, 馬爾科

回答

0
+0

感謝您的快速回復,但QBE如何與Linq到nHibernate?我錯過了什麼嗎? – mCasamento

+0

從你的問題,這是你想要實現的,使用一個對象來執行查詢。 – mathieu

+0

嗯,是的,這是正確的,但是您的解決方案意味着要從LINQ切換到QBE,不幸的是,在我的情況下這是不可行的。 – mCasamento

相關問題