Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
唯一约束Nhibernate_Nhibernate_Hibernate_Fluent Nhibernate - Fatal编程技术网

唯一约束Nhibernate

唯一约束Nhibernate,nhibernate,hibernate,fluent-nhibernate,Nhibernate,Hibernate,Fluent Nhibernate,我有一个具有Nhibernate映射的对象,该映射具有代理项ID和自然ID。由于自然ID是唯一约束的,因此,如果该对象已在数据库中且具有相同的自然ID,则插入查询将失败。我的解决方案是在尝试插入之前手动检查数据库中是否存在自然ID插入 有没有办法指定Nhibernate在插入自然Id/唯一约束之前进行选择 无论如何,您必须转到数据库 不过,您可以使用NH验证器以更透明的方式进行验证 阅读Fabio Maulo的以下帖子:我通常通过尝试插入(提交更改)并捕获结果异常来解决这种情况 无论如何,您都必

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


有没有办法指定Nhibernate在插入自然Id/唯一约束之前进行选择

无论如何,您必须转到数据库

不过,您可以使用NH验证器以更透明的方式进行验证


阅读Fabio Maulo的以下帖子:

我通常通过尝试插入(提交更改)并捕获结果异常来解决这种情况


无论如何,您都必须访问数据库,因此失败的插入与选择插入的成本基本相同(如果不便宜的话)。。。而且更安全。

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

我最终为Nhibernate构建了一个SaveOrUpdate侦听器,以便在对象即将保存到数据库时,我可以确定是否应检查其唯一性。我不只是选择查看数据库中是否存在对象唯一属性,而是执行select for update(悲观锁),这样行将被锁定,这样我就可以安全地合并和更新对象。确实会创建O(2N)查询,但如果出现问题,我可以将其简化为单个merge语句


当这些对象是级联构造的一部分时,问题就出现了。我真的不关心的单个对象是否会更新或插入,它会破坏整个构造的事务。这就是为什么您应该同时执行这两项操作!Diego posted链接是使用NH Validator查询数据库以确保博客帖子的自然ID(标题和日期)未被违反的一个示例。这将完全按照您的要求执行—在尝试保存实体之前,NHibernate将检查验证,这将导致执行select查询。如果您能够分享您是如何执行此操作的,那将非常棒。我也处于同样的情况,并且正在努力实现这样一个侦听器