唯一约束Nhibernate

问题描述:

我有一个具有代理ID和自然ID的Nhibernate映射的对象。自从源自然ID被唯一约束,如果对象已经在具有相同自然ID的数据库中,则插入查询将失败。我的解决方案是在尝试插入之前手动检查自然ID是否在数据库中。唯一约束Nhibernate

有没有一种方法可以指定Nhibernate在插入自然ID /唯一约束之前进行选择?

以某种方式,你必须去数据库。

但是,您可以使用NH验证程序以更透明的方式执行此操作。

阅读从法比奥Maulo以下职位:http://fabiomaulo.blogspot.com/2009/10/validation-through-persistence-not.html

+0

验证器如何帮助我? – Will 2010-03-17 17:22:34

+0

Diego发布的链接是使用NH Validator查询数据库以确保BlogPost的自然ID(标题和日期)未被违反的示例。这将完全符合你所要求的 - 在尝试保存实体之前,NHibernate将检查验证,这将导致选择查询被执行。 – 2011-09-28 20:52:20

我通常只是试图插入(提交更改)和追赶,最终异常解决那种情景。

无论如何,您将必须击中数据库,所以失败的INSERT与SELECT具有基本相同的成本(如果不是更便宜)......并且更安全。

+0

问题来自何时这些对象是级联构造的一部分。我真的不关心它是否更新或插入的单个对象会中断整个构造的事务。 – Will 2010-03-18 14:12:01

+0

这就是为什么你应该这样做! – dariol 2012-06-05 23:39:38

我保存或更新前检查唯一性。然后我可以显示一个很好的验证信息。我发现很难读取异常并将违反约束条件匹配到正确的字段。也许NH已经提取了支持数据库的错误代码......我还没有研究过。在极少数情况下,检查与保存之间的约束被违反,用户将收到一般错误消息。

我最终为Nhibernate构建了一个SaveOrUpdate侦听器,因此当对象即将被保存到数据库中时,我可以确定是否应检查其唯一性。而不是仅仅选择查看数据库中是否存在对象唯一属性,而是选择更新(悲观锁),以便将该行锁定,以便我可以安全地合并和更新对象。该确实创建O(2N)查询,但如果它成为一个问题,我可以将它简化为一个合并语句。

http://en.wikipedia.org/wiki/Merge_(SQL)

+0

如果你能分享你如何做到这一点,那将是非常好的。我处于同样的境地,正在努力实施这样一个倾听者 – flipchart 2012-05-08 18:20:32