在尝试使用手动生成的 ID 持久化实体时,我在 NHibernate (v3.3) 中遇到了一个奇怪的错误:
无法确定具有分配标识符 {Id} 的 {Entity} 是暂时的还是分离的;查询数据库。在会话中使用显式 Save() 或 Update() 来防止这种情况。
但问题是,我使用的Save
是SaveOrUpdate
. 可能是什么问题呢?
在尝试使用手动生成的 ID 持久化实体时,我在 NHibernate (v3.3) 中遇到了一个奇怪的错误:
无法确定具有分配标识符 {Id} 的 {Entity} 是暂时的还是分离的;查询数据库。在会话中使用显式 Save() 或 Update() 来防止这种情况。
但问题是,我使用的Save
是SaveOrUpdate
. 可能是什么问题呢?
事实证明,我的问题实际上是在保存父实体时发生的,其中包含一对多关系中的子实体:
<class xmlns="urn:nhibernate-mapping-2.2" name="ParentTable" table="ParentTable">
<id name="ManuallyAssignedId">
<generator class="assigned" />
</id>
<!- child table also has a manually assigned id -->
<bag cascade="all" inverse="true" name="ChildTable">
<key>
<column name="ParentTable_id"/>
</key>
<one-to-many class="ChildTable" />
</bag>
</class>
换句话说,Save
对父实体的调用会导致SaveOrUpdate
对子实体的调用,这是 NHibernate 所抱怨的。
当我意识到这一点时,我很快找到了这个 StackOverflow 线程:How to save a child with assigned id in nhibernate,它有两个很好的建议:
创建并映射一个版本或时间戳列- 如果它为空,NHibernate 将知道它需要持久化实体,或者
将自定义拦截器附加到会话(或会话工厂)并使用自定义私有字段来跟踪实体是否需要持久化。