2

我有一个 NHibernate 映射类,它保存绑定到磁盘上文件的二进制数据。业务逻辑很简单:

  • 当对象存储在数据库中时,blob 被写入一个正确命名以匹配对象 ID 的文件
  • 当从数据库加载对象时,blob 被文件内容填充
  • 当从数据库中删除对象时,文件也被删除

我使用了 IPostDeleteEventListener 来处理这三种情况

Session.Delete()唯一的问题是,如果由于某种原因,事务在文件已被删除后回滚,但记录保留在数据库中,当应用程序尝试(重新)加载未删除的对象时会导致 FileNotFoundException。

另外,但这不是什么大问题,如果在插入后取消事务,我会得到一个垃圾文件。

只有在提交事务时,我才能执行这些文件系统操作?

[添加] MAYBE...我说也许,我找到了解决方法。该ITransaction接口公开了一个RegisterSynchronization接受接口作为参数的方法。也许这可以是解决方法:仅在事务完成后存储/删除文件。我需要进行更多调查,但似乎没有设计方法可以直接从 NHibernate 事件侦听器子系统挂钩提交/回滚。

4

1 回答 1

1

由于文件系统不是事务性的,并且没有暴露“提交后”事件,因此最好在 NH 的事件系统之外进行(即在更高级别的层中)

于 2011-01-29T05:34:11.010 回答