我在NHibernate(v3.3)中遇到一个奇怪的错误,当尝试使用手动生成的ID持久保存实体时:
无法确定分配了标识符{Id}的{Entity}是暂时的还是分离的;查询数据库。 在会话中使用显式Save()或Update()来防止这种情况。
但问题是,我我使用Save
而不是SaveOrUpdate
。可能是什么问题?
答案 0 :(得分:7)
事实证明我的问题实际上是在保存父实体时发生的,包含一对多关系中的子实体:
<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,它有两个很好的建议:
Create and map a Version or Timestamp column - 如果它为null,NHibernate将知道它需要持久保存实体,或者
Attach a custom Interceptor to a session (or session factory)并使用自定义私有字段来跟踪是否需要保留实体。