0

我有一个我认为是 NHibernate 相当常见的用例。我创建了一个实体并尝试使用 ISession.Save() 和 Transaction.Commit() 来保存它。在这一点上,我希望违反唯一/主键约束之类的事情会作为例外出现在我面前。然而,我看到的只是一个 GenericADOException。这并不能帮助我区分真正的数据库故障与要求用户为实体选择另一个名称以保持唯一性之类的事情。

目前,我已经实现了首先查询的丑陋解决方法,以确保不会违反约束。这只是一个等待发生的竞争条件,我真的不希望用户看到“糟糕,数据库做了一些有趣的事情!也许你应该再试一次。” 种消息。

有没有一种优雅的方法来解决这个问题?

4

1 回答 1

0

NHibernate 不知道约束(并且一开始就很难强制执行唯一约束),因此处理这在很大程度上取决于您。我认为你在正确的轨道上通过查询检查该值是否不存在,但正如你所提到的,这留下了另一个进程/线程首先插入该值的可能性。该方法的解决方案是独占锁,但当然您必须考虑该锁的含义。我不知道 NHibernate 的锁定方法是如何工作的,但如果它们不能提供您需要的东西,您可以随时访问连接并使用原始 SQL。

于 2009-03-10T23:02:03.610 回答