【问题标题】:NHibernate LINQ Query - object references an unsaved transient instance - Without savingNHibernate LINQ Query - 对象引用未保存的瞬态实例 - 不保存
【发布时间】:2012-05-22 13:39:08
【问题描述】:

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

比我得到的

对象引用了一个未保存的瞬态实例 - 保存瞬态 刷新之前的实例或将属性的级联操作设置为 可以让它自动保存的东西。类型:DomainModel.Address, 实体:DomainModel.Address

在 NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(字符串 entityName,对象实体,ISessionImplementor 会话)在 NHibernate.Type.EntityType.GetIdentifier(对象值, ISessionImplementor 会话)在 NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand cmd,对象 值,Int32 索引,ISessionImplementor 会话)在 NHibernate.Param.NamedParameterSpecification.Bind(IDbCommand 命令, IList1 multiSqlQueryParametersList, Int32 singleSqlParametersOffset, IList1 sqlQueryParametersList, QueryParameters queryParameters, ISessionImplementor 会话)在 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 查询空间,IType[] 结果类型)在 NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor 会话,查询参数查询参数)在 NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor 会话,查询参数查询参数)在 NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters、ISessionImplementor 会话、IList 结果)在 NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, 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.QueryableBase1.GetEnumerator() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 源)

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

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

进行映射

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

对此行为有任何想法吗?

谢谢, 马可

【问题讨论】:

    标签: nhibernate linq-to-nhibernate


    【解决方案1】:

    【讨论】:

    • 感谢您的快速回复,但 QBE 与 Linq To nHibernate 有何关系?我错过了什么吗?
    • 从你的问题来看,这是你想要实现的,使用一个对象来执行查询。
    • 嗯,是的,这是正确的,但您的解决方案意味着从 LINQ 切换到 QBE,不幸的是,这在我的场景中是不可行的。
    • 好的。如果你不能切换到QBE,也不能查询属性,你应该解释你的整个问题,否则很难帮助你。
    • 我已经更改了一些内容并将查询切换到属性,现在它可以工作了。也许我试图实现的目标是 nHibernate 不支持的。由于这个 cmets,我将问题标记为已回答
    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 2014-01-23
    • 2012-02-19
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多