1

我正在使用 NHibernate 来保存要求这些对象的属性之一必须是唯一的对象。该系统的设计使得有时可能会尝试两次保存相同的对象。这当然会导致违反唯一性约束并且 NHibernate 会抛出异常。异常发生在我尝试保存对象时,而不是在 Transaction.Commit() 时间。发生这种情况时,我想简单地捕获异常,丢弃对象并继续保存其他类似的对象。但是,我还没有找到允许这种情况发生的方法。一旦发生该异常,我就无法继续保存其他对象并提交事务。

我发现的唯一解决方法是始终通过对唯一属性运行查询来检查对象是否存在。这行得通,但它似乎不必要地昂贵。我想避免对数据库的额外打击。有没有办法做到这一点?

谢谢

4

1 回答 1

1

您所描述的问题必须在更高级别上解决,然后是 NHibernate 会话。看看9.8。异常处理,摘录:

如果 ISession 抛出异常,您应该立即回滚事务,调用 ISession.Close() 并丢弃 ISession 实例。ISession 的某些方法不会使会话保持一致状态。

因此,我的建议是,通过一些验证来包装对数据层 (DL) 的调用。将 if/try 逻辑放在 Session 之外。

因为即使万一我们正在使用版本控制(参见5.1.7. version(一种非常强大的方式来生存并发) ......我们已经被提供StaleExceptions并且必须在 DL 之外解决它们

于 2013-11-14T04:25:53.850 回答