唯一约束Nhibernate
我有一个具有代理ID和自然ID的Nhibernate映射的对象。自从源自然ID被唯一约束,如果对象已经在具有相同自然ID的数据库中,则插入查询将失败。我的解决方案是在尝试插入之前手动检查自然ID是否在数据库中。唯一约束Nhibernate
有没有一种方法可以指定Nhibernate在插入自然ID /唯一约束之前进行选择?
以某种方式,你必须去数据库。
但是,您可以使用NH验证程序以更透明的方式执行此操作。
阅读从法比奥Maulo以下职位:http://fabiomaulo.blogspot.com/2009/10/validation-through-persistence-not.html
我保存或更新前检查唯一性。然后我可以显示一个很好的验证信息。我发现很难读取异常并将违反约束条件匹配到正确的字段。也许NH已经提取了支持数据库的错误代码......我还没有研究过。在极少数情况下,检查与保存之间的约束被违反,用户将收到一般错误消息。
我最终为Nhibernate构建了一个SaveOrUpdate侦听器,因此当对象即将被保存到数据库中时,我可以确定是否应检查其唯一性。而不是仅仅选择查看数据库中是否存在对象唯一属性,而是选择更新(悲观锁),以便将该行锁定,以便我可以安全地合并和更新对象。该确实创建O(2N)查询,但如果它成为一个问题,我可以将它简化为一个合并语句。
如果你能分享你如何做到这一点,那将是非常好的。我处于同样的境地,正在努力实施这样一个倾听者 – flipchart 2012-05-08 18:20:32
验证器如何帮助我? – Will 2010-03-17 17:22:34
Diego发布的链接是使用NH Validator查询数据库以确保BlogPost的自然ID(标题和日期)未被违反的示例。这将完全符合你所要求的 - 在尝试保存实体之前,NHibernate将检查验证,这将导致选择查询被执行。 – 2011-09-28 20:52:20