NHibernate.Event.IPostDeleteEventListener与事务不兼容

时间:2011-01-29 02:08:18

标签: c# nhibernate transactions acid

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

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

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

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

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

在提交交易时,如何才能执行这些文件系统操作

[添加]可能......我说也许,我找到了一个解决方法。 ITransaction接口公开了一个RegisterSynchronization方法,该方法接受一个接口作为参数。可能是解决方法:仅在完成事务后存储/删除文件。我需要进一步研究,但似乎没有工程方法可以直接从NHibernate事件监听器子系统挂接提交/回滚。

1 个答案:

答案 0 :(得分:1)

由于文件系统不是事务性的,并且没有暴露“post-commit”事件,所以最好在NH的事件系统外部(即在更高级别的层中)