我有一个带有Nhibernate映射的对象,该映射具有代理ID和自然ID。由于cource,自然ID受到唯一约束,如果对象已经在具有相同自然ID的数据库中,则插入查询将失败。我的解决方案是在尝试插入之前手动检查数据库中是否有自然ID。
有没有办法指定Nhibernate在插入自然Id /唯一约束之前进行选择?
答案 0 :(得分:1)
不管怎样,你都必须去DB。
但是,您可以使用NH Validator以更透明的方式进行此操作。
阅读Fabio Maulo的以下帖子:http://fabiomaulo.blogspot.com/2009/10/validation-through-persistence-not.html
答案 1 :(得分:1)
我最终为Nhibernate构建了一个SaveOrUpdate侦听器,因此当对象即将保存到数据库时,我可以确定是否应该检查它们的唯一性。我没有选择查看数据库中是否存在对象唯一属性,而是选择更新(悲观锁定),因此该行将被锁定,以便我可以安全地合并和更新对象。确实会创建O(2N)查询,但如果它成为问题,我可以将其简化为单个合并语句。
答案 2 :(得分:0)
我通常只是尝试插入(提交更改)并捕获生成的异常来解决这种情况。
无论如何你都必须点击数据库,因此失败的INSERT基本上与SELECT相同的成本(如果不便宜)......而且它更安全。
答案 3 :(得分:0)
我在保存或更新之前检查唯一性。然后我可以显示一个很好的验证消息。我发现很难读取异常并将约束违规与正确的字段相匹配。也许NH已经抽象了支持数据库的错误代码......我没有考虑过。在极少数情况下,在检查和保存之间违反约束,用户会收到一般错误消息。