Невозможно определить, является ли объект временным или независимым
Я получаю странную ошибку в 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, у которого есть два отличных предложения:
Создайте и сопоставьте столбец Version или Timestamp - если он нулевой, NHibernate будет знать, что ему необходимо сохранить сущность, или
Присоедините пользовательский Interceptor к сеансу (или фабрике сеансов) и используйте настраиваемое приватное поле, чтобы отслеживать необходимость сохранения сущности.