C# NHibernate.Event.IPostDeleteEventListener无法很好地处理事务

C# NHibernate.Event.IPostDeleteEventListener无法很好地处理事务,c#,nhibernate,transactions,acid,C#,Nhibernate,Transactions,Acid,我有一个NHibernate映射类,它保存绑定到磁盘上文件的二进制数据。业务逻辑非常简单: 当对象存储在数据库中时,blob将写入一个正确命名的文件,以匹配对象ID 从DB加载对象时,blob将填充文件内容 当对象从数据库中删除时,文件也会被删除 我使用IPostDeleteEventListener来处理这三种情况 唯一的问题是,如果事务由于某种原因在Session.Delete()之后回滚,则文件已被删除,但记录保留在数据库中,这会导致应用程序尝试(重新)加载未删除的对象时出现FileN

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

  • 当对象存储在数据库中时,blob将写入一个正确命名的文件,以匹配对象ID
  • 从DB加载对象时,blob将填充文件内容
  • 当对象从数据库中删除时,文件也会被删除
我使用IPostDeleteEventListener来处理这三种情况

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

还有,但这不是什么大问题,若事务在插入后被取消,我会得到一个垃圾文件

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


[补充]也许。。。我说也许,我找到了解决办法。
ITransaction
接口公开了一个
RegisterSynchronization
方法,该方法接受接口作为参数。也许这就是解决方法:仅在事务完成后存储/删除文件。我需要进行更多的研究,但似乎没有工程化的方法直接从NHibernate事件监听器子系统钩住提交/回滚。

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

嗯。。。。阅读是件坏事。。。您是否同意NH开发人员一定要实现一个post-commit事件来处理这些变更?我开始有一些基于代理/lambda的想法。无论如何,等待关于“NH开发者”主题的其他意见不会仅仅因为你会发现它有用而实现它。你可以在测试的同时提供一个补丁,并为它提供一个合理的理由,或者只是使用补丁版本。我想我用错了词。。。“您是否同意这是应该明确建议NH开发人员实施的内容?”+1根据您的评论,无论如何,我提交了一份报告,但我认为我没有NH core的知识来为补丁做出贡献,即使我有技能和时间:(老实说……这不太可能发生。我的意见是,不管怎样,你试图从NH打电话的逻辑不属于那里。你好,这个问题有什么进展吗?我在nhibernate论坛[NH-2523]上看到了你的问题,但从那以后似乎没有进展。