Невозможно определить, является ли объект временным или независимым

Я получаю странную ошибку в NHibernate (v3.3), когда пытаюсь сохранить сущность с помощью сгенерированного вручную идентификатора:

Невозможно определить, является ли {Entity} с назначенным идентификатором {Id} временным или отсоединенным; запрос к базе данных. Используйте явные Save() или Update() в сеансе, чтобы предотвратить это.

Но проблема в том, что я использую Save вместо SaveOrUpdate, В чем может быть проблема?

1 ответ

Решение

Оказалось, что моя проблема действительно возникала при сохранении родительской сущности, содержащей дочерние сущности в отношении один-ко-многим:

<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 жаловался.

Когда я понял это, я быстро нашел этот поток Stackru: как сохранить дочерний элемент с назначенным идентификатором в nhibernate, у которого есть два отличных предложения:

  1. Создайте и сопоставьте столбец Version или Timestamp - если он нулевой, NHibernate будет знать, что ему необходимо сохранить сущность, или

  2. Присоедините пользовательский Interceptor к сеансу (или фабрике сеансов) и используйте настраиваемое приватное поле, чтобы отслеживать необходимость сохранения сущности.

Другие вопросы по тегам