NHibernate.Event.IPostDeleteEventListener плохо работает с транзакциями - PullRequest
2 голосов
/ 29 января 2011

У меня есть сопоставленный NHibernate класс, который содержит двоичные данные, связанные с файлом на диске. Бизнес логика очень проста:

  • Когда объект сохраняется в базе данных, большой двоичный объект записывается в файл с правильным именем, совпадающим с идентификатором объекта
  • Когда объект загружается из БД, блоб заполняется содержимым файла
  • Когда объект удаляется из БД, файл тоже удаляется

Я использовал IPostDeleteEventListener для обработки трех ситуаций

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

Кроме того, но это не имеет большого значения, если транзакция отменяется после вставки, я получаю файл мусора.

Что я могу сделать для выполнения этих операций файловой системы только , когда транзакция фиксируется?

[Добавить] МОЖЕТ ... Я сказал, может быть, я нашел обходной путь. Интерфейс ITransaction предоставляет метод RegisterSynchronization, который принимает интерфейс в качестве аргумента. МОЖЕТ быть, что может быть обходной путь: сохранение / удаление файла только после завершения транзакции. Мне нужно больше исследовать, но, похоже, нет никакого спроектированного способа перехватить фиксацию / откат непосредственно из подсистемы прослушивателя событий NHibernate.

1 Ответ

1 голос
/ 29 января 2011

Поскольку файловая система не является транзакционной, и событие «post-commit» не выставляется, лучше сделать это вне системы событий NH (то есть на уровне более высокого уровня)

...