我正在使用NHibernate来保存要求这些对象上的某个属性必须唯一的对象。系统的设计使得有可能偶尔尝试将同一对象保存两次。这当然会导致违反唯一性约束,NHibernate会抛出异常。异常发生在我尝试保存对象时,而不是在Transaction.Commit()时。当发生这种情况时,我想简单地捕获异常,丢弃对象并继续保存其他类似对象。但是,我还没有找到允许这种情况发生的方法。一旦发生异常,我就无法继续保存其他对象并提交事务。
我发现的唯一解决方法是始终通过在唯一属性上运行查询来检查对象是否存在。这有效,但似乎不必要的昂贵。我想避免对数据库的额外打击。有没有办法做到这一点?
由于
答案 0 :(得分:1)
您已经描述过的问题必须在更高级别的NHibernate会话上解决。看看9.8. Exception handling,摘录:
如果ISession抛出异常,则应立即回滚 在事务中,调用ISession.Close()并丢弃ISession 实例。某些ISession方法不会将会话留在 一致的状态。
所以,我建议,通过一些验证将调用包装到您的数据层(DL)。将if / try逻辑放在Session之外。
因为即使在案例中,我们正在使用版本控制(请参阅5.1.7. version)(一种非常强大的方法来保存并发) ...我们提供了StaleExceptions
并且必须在DL之外解决它们