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

时间:2012-10-16 14:38:31

标签: .net nhibernate transient

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

  

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

但问题是,我使用Save而不是SaveOrUpdate。可能是什么问题?

1 个答案:

答案 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,它有两个很好的建议:

  1. Create and map a Version or Timestamp column - 如果它为null,NHibernate将知道它需要持久保存实体,或者

  2. Attach a custom Interceptor to a session (or session factory)并使用自定义私有字段来跟踪是否需要保留实体。