У меня есть сопоставленный NHibernate класс, который содержит двоичные данные, связанные с файлом на диске. Бизнес логика очень проста:
- Когда объект сохраняется в базе данных, большой двоичный объект записывается в файл с правильным именем, совпадающим с идентификатором объекта
- Когда объект загружается из БД, блоб заполняется содержимым файла
- Когда объект удаляется из БД, файл тоже удаляется
Я использовал IPostDeleteEventListener для обработки трех ситуаций
Единственная проблема в том, что если транзакция по какой-то причине откатывается после Session.Delete()
, файл уже удален, но запись сохраняется в БД, что приводит к исключению FileNotFoundException, когда приложение пытается (повторно) загрузить не удаленный объект.
Кроме того, но это не имеет большого значения, если транзакция отменяется после вставки, я получаю файл мусора.
Что я могу сделать для выполнения этих операций файловой системы только , когда транзакция фиксируется?
[Добавить] МОЖЕТ ... Я сказал, может быть, я нашел обходной путь. Интерфейс ITransaction
предоставляет метод RegisterSynchronization
, который принимает интерфейс в качестве аргумента. МОЖЕТ быть, что может быть обходной путь: сохранение / удаление файла только после завершения транзакции. Мне нужно больше исследовать, но, похоже, нет никакого спроектированного способа перехватить фиксацию / откат непосредственно из подсистемы прослушивателя событий NHibernate.