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