Глава 9 охватывает все это лучше, чем я могу:
http://nhibernate.info/doc/nh/en/index.html
Но заметки в скале:
Save()
берет новый объект без идентификатора и присоединяет его к сеансу. Объект будет INSERT
'd.
Update()
берет существующий объект, который имеет идентификатор, но отсутствует в сеансе, и присоединяет его к сеансу. Объект будет UPDATE
'd.
SaveOrUpdate()
смотрит на идентификатор и решает, что необходимо в приведенном выше.
SaveOrUpdateCopy()
отличается тем, что у вас есть два объекта с одинаковым идентификатором - один в сеансе, а другой нет. Если вы попытаетесь и update
тот, который не в сеансе, исключение выдается нормально (вы сейчас пытаетесь присоединить два объекта, которые представляют один и тот же постоянный объект к сеансу). SaveOrUpdateCopy()
копирует состояние объекта без сеанса в состояние объекта сеанса.
Я не уверен, как вы собираетесь использовать NH, но во многих случаях все, что вам нужно, это Save()
. Сессия выполняет ВСЕ работы, необходимые для того, чтобы знать, что нужно обновить, и просто Flush()
или Commit()
делает все, что вам нужно.