Вы пытались вызвать .SaveOrUpdateCopy ()?
Он должен работать во всех случаях, если в сеансе существует сущность с тем же идентификатором или вообще нет сущности. По сути, это метод перехвата, поскольку он преобразует временный объект в постоянный (Сохранить), обновляет объект, если он существует (Обновить), или даже обрабатывает, если объект является копией уже существующего объекта (Копировать) .
В противном случае вам, возможно, придется идентифицировать и .Evict () существующий объект перед прикреплением (.Update ()) вашего «нового» объекта.
Это должно быть достаточно легко сделать:
IPersistable entity = Whatever(); // This is the object we're trying to update
// (IPersistable has an id field)
session.Evict(session.Get(entity.GetType(), entity.Id));
session.SaveOrUpdate(entity);
Хотя приведенный выше код, вероятно, может быть связан с некоторой проверкой нуля вызова .Get ().