Должен ли Nhibernate Session.Evict() действовать на прокси-объекте? (Или есть альтернативный способ клонирования сохраненного графа объектов?)
Я пытаюсь создать клон персистентного графа объектов, и похоже, что Session.Evict(PersistedObject) - способ сделать это. Удалив экземпляр из кэша сеанса, я могу сохранить его как новую "клонированную" запись.
Я попробовал три подхода, и каждый был неудачным.
- Используйте готовую загрузку, чтобы получить мой объектный граф из базы данных и попытаться выселить его. Это приводит к KeyNotFoundException
- Используйте Session.Load(objectId) и попытайтесь его выселить. Evict работает, но у меня есть только прокси для работы, а не гидратированный объект, который мне нужен
- Используйте Session.Get(objectId) и попытайтесь его выселить. Это приводит к KeyNotFoundException
Я изо всех сил пытался найти любую реальную документацию или примеры на эту тему. Я нашел некоторые, которые близко, но ничего, что действительно объясняет, где я иду не так
- NHibernate Session.Evict()
- NHibernate выселить по id
- http://thecuttingledge.com/?tag=nhibernate
- Как мне скопировать объект с помощью NHibernate
- https://sonyarouje.com/2013/11/13/keynotfoundexception-from-nhibernates-session-evict/
Что касается последней ссылки, я проверил мои методы Equals и GetHashCode, но они не попадают при вызове Evict. Кроме того, Session.Contains(objectToBeEvicted) возвращает истину непосредственно перед Evict()
Что касается второго вопроса в заголовке - есть ли лучший способ подойти к этой проблеме? Это не может быть такой редкий сценарий
заранее спасибо
2 ответа
Чтобы ответить на первоначальный вопрос:
Нет, Evict()
не ограничивается действием на прокси, он может удалить любой объект из сеанса. Если вы получаете какое-то исключение, скорее всего, вы делаете что-то не так, но вопрос не содержит достаточно информации, чтобы выяснить, что именно.
Попробуйте сделать глубокий клон ( .Net Deep cloning - каков наилучший способ сделать это?) Вашего объекта, а затем добавьте его в сеанс.