Lou*_*Lou 4 .net nhibernate transient
我在NHibernate(v3.3)中遇到一个奇怪的错误,当尝试使用手动生成的ID持久保存实体时:
无法确定具有指定标识符{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>
Run Code Online (Sandbox Code Playgroud)
换句话说,Save
对父实体的调用导致了一个SaveOrUpdate
on子实体,NHibernate抱怨这个实体.
当我意识到这一点时,我很快发现了这个StackOverflow线程:如何在nhibernate中保存具有指定id的子节点,这有两个很好的建议:
创建并映射Version或Timestamp列 - 如果它为null,NHibernate将知道它需要持久保存实体,或者
将自定义拦截器附加到会话(或会话工厂)并使用自定义私有字段来跟踪实体是否需要持久化.