我有一个 NHibernate 映射类,它保存绑定到磁盘上文件的二进制数据。业务逻辑很简单:
- 当对象存储在数据库中时,blob 被写入一个正确命名以匹配对象 ID 的文件
- 当从数据库加载对象时,blob 被文件内容填充
- 当从数据库中删除对象时,文件也被删除
我使用了 IPostDeleteEventListener 来处理这三种情况
Session.Delete()
唯一的问题是,如果由于某种原因,事务在文件已被删除后回滚,但记录保留在数据库中,当应用程序尝试(重新)加载未删除的对象时会导致 FileNotFoundException。
另外,但这不是什么大问题,如果在插入后取消事务,我会得到一个垃圾文件。
只有在提交事务时,我才能执行这些文件系统操作?
[添加] MAYBE...我说也许,我找到了解决方法。该ITransaction
接口公开了一个RegisterSynchronization
接受接口作为参数的方法。也许这可以是解决方法:仅在事务完成后存储/删除文件。我需要进行更多调查,但似乎没有设计方法可以直接从 NHibernate 事件侦听器子系统挂钩提交/回滚。