无法确定实体是暂时的还是分离的

Lou*_*Lou 4 .net nhibernate transient

我在NHibernate(v3.3)中遇到一个奇怪的错误,当尝试使用手动生成的ID持久保存实体时:

无法确定具有指定标识符{Id}的{Entity}是暂时的还是分离的; 查询数据库.在会话中使用显式Save()或Update()来防止这种情况.

但问题是,我正在使用Save而不是SaveOrUpdate.可能是什么问题呢?

Lou*_*Lou 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>  
Run Code Online (Sandbox Code Playgroud)

换句话说,Save对父实体的调用导致了一个SaveOrUpdateon子实体,NHibernate抱怨这个实体.

当我意识到这一点时,我很快发现了这个StackOverflow线程:如何在nhibernate中保存具有指定id的子节点,这有两个很好的建议:

  1. 创建并映射Version或Timestamp列 - 如果它为null,NHibernate将知道它需要持久保存实体,或者

  2. 将自定义拦截器附加到会话(或会话工厂)并使用自定义私有字段来跟踪实体是否需要持久化.