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 (文字列エンティティ名、オブジェクト エンティティ、ISessionImplementor セッション) で NHibernate.Type.EntityType.GetIdentifier (オブジェクト値、ISessionImplementor セッション) で NHibernate.Type.ManyToOneType.NullSafeSet (IDbCommand cmd、オブジェクト値、Int32 インデックス) 、ISessionImplementor セッション) NHibernate.Param.NamedParameterSpecification.Bind(IDbCommand コマンド、IList 1 multiSqlQueryParametersList, Int32 singleSqlParametersOffset, IList1 sqlQueryParametersList、QueryParameters queryParameters、ISessionImplementor セッション) at 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, ISet1 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 session, IList results) at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) at NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression queryExpression, QueryParameters parameters) ) NHibernate で 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();

すべて正常に動作します。2 つのクラスと関連するマッピングの唯一の違いは、Address が < class /> タグを使用してマッピングされるのに対し、Person は継承マッピング Party => Person に属し、< Joined-subclass /> を使用してマッピングされることです。

オブジェクトではなく Key フィールドを使用してクエリを書き直すことができることはわかっていますが、これは問題の単純化されたバージョンにすぎず、この解決策は適用できません。

この動作について何か考えはありますか?

ありがとう、マルコ

4

1 に答える 1

0

QBE(Query By Example)を見てください:

于 2012-05-22T13:48:35.277 に答える