Должен ли Nhibernate Session.Evict() действовать на прокси-объекте? (Или есть альтернативный способ клонирования сохраненного графа объектов?)

Я пытаюсь создать клон персистентного графа объектов, и похоже, что Session.Evict(PersistedObject) - способ сделать это. Удалив экземпляр из кэша сеанса, я могу сохранить его как новую "клонированную" запись.

Я попробовал три подхода, и каждый был неудачным.

  1. Используйте готовую загрузку, чтобы получить мой объектный граф из базы данных и попытаться выселить его. Это приводит к KeyNotFoundException
  2. Используйте Session.Load(objectId) и попытайтесь его выселить. Evict работает, но у меня есть только прокси для работы, а не гидратированный объект, который мне нужен
  3. Используйте Session.Get(objectId) и попытайтесь его выселить. Это приводит к KeyNotFoundException

Я изо всех сил пытался найти любую реальную документацию или примеры на эту тему. Я нашел некоторые, которые близко, но ничего, что действительно объясняет, где я иду не так

Что касается последней ссылки, я проверил мои методы Equals и GetHashCode, но они не попадают при вызове Evict. Кроме того, Session.Contains(objectToBeEvicted) возвращает истину непосредственно перед Evict()

Что касается второго вопроса в заголовке - есть ли лучший способ подойти к этой проблеме? Это не может быть такой редкий сценарий

заранее спасибо

2 ответа

Чтобы ответить на первоначальный вопрос:

Нет, Evict() не ограничивается действием на прокси, он может удалить любой объект из сеанса. Если вы получаете какое-то исключение, скорее всего, вы делаете что-то не так, но вопрос не содержит достаточно информации, чтобы выяснить, что именно.

Попробуйте сделать глубокий клон ( .Net Deep cloning - каков наилучший способ сделать это?) Вашего объекта, а затем добавьте его в сеанс.

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