【发布时间】:2013-11-30 09:43:42
【问题描述】:
我正在尝试保存一个内部包含许多引用元素的复杂对象,并且它在大多数情况下都能完美运行。
但是在某些情况下,我们会遇到以下异常,
object 引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例,或将属性的级联操作设置为使其自动保存的内容。类型:Namespace.Core.Client.ClientDetails,实体:Namespace.Core.Client.ClientDetails
问题是,我们试图保存的复杂对象中大约有 12 个 ClientDetails 元素。有没有办法确定是哪个对象实例导致了这个问题? 通过 NHibernate 日志记录或其他方式? 我用于保存的代码示例如下,
_repository.Save<SuperParent>(obj);
_repository.Flush();
请注意,当我将 Nhibernate show_sql 设置为 true 时,我能够看到正确生成的所有查询,但是当调用 flush 时,会引发异常。
请帮助解决问题。
【问题讨论】:
-
只是一个提示。每个对象是由 NHibernate 区分的,如果它是新的/暂时的要插入或现有的要更新。对于
intID,它是:ID > 0对象是现有的,ID == 0对象是新的。尝试在 Flush 之前检查哪个对象没有生成 ID……这将是可疑的。有了这个,你可以找到它所属的 Property 集合并用 cascade 属性标记它...... NHibernate 然后将为你保存所有的东西 -
查看内部异常(如果存在)。通常 NHibernate 会为未保存的对象(其中 ID 为 0)抛出异常。所以异常/内部异常应该给你足够的细节来弄清楚。
-
嗨 Radim,是的,我试图收集所有生成的查询。但它分两步发生。 1. 当 _repository.Save(obj) 被调用时,NHibernate 会生成所有需要的 INSERT sql 查询,而不需要 FK 引用。 2. 当 _repository.Flush() 被调用时,NHibernate 生成 UPDATE 查询以更新所有对象之间的所有 FK 引用,并且它没有发现 'ClientDetails' 元素的 UPDATE 少一个并抛出此异常。如果我的,请纠正我理解是错误的,建议。
-
嗨 MichaC,没有内部异常详细信息,它只提供实体名称,并且没有对象 ID 或其他值,我们可以通过这些值识别导致问题的确切对象实例。谢谢跨度>
标签: c# nhibernate