我刚开始在个人项目中使用RavenDB,到目前为止插入,更新和查询都非常容易实现。但是,我遇到过需要GetOrCreate方法的情况,我想知道实现这个目标的最佳方法是什么。
具体而言,我正在与OpenID集成,一旦进行了身份验证,用户就会被重定向到我的网站。此时我要么从Raven中检索他们的用户记录(通过查询ClaimsIdentifier属性)或创建一个新记录。用户的ID当前由Raven设置。
显然我可以在两个语句中写这个但是没有围绕select和create的某种事务我可能最终在数据库中有两个用户记录,并且具有相同的声明标识符。
有没有实现这种功能?可能更重要的是你认为我走错了路。我假设即使我可以创建一个事务,它也会扩展到多个服务器,并且无论如何都会增加性能瓶颈。
更好的方法是将Query和Create操作作为单独的语句,并在检索用户并在该点合并时检查重复项。或者在预定的任务上做类似的事情?
我不禁觉得我在这里遗漏了一些明显的东西,所以对这个问题的任何建议都会非常感激。
注意:虽然扩展到多个服务器对于个人项目来说似乎是不可靠的,但在将其用于工作之前,我将其用作对Raven的评估。
答案 0 :(得分:2)
Dan,虽然RavenDB支持交易,但我不会这样做。相反,您可以使用用户ClaimsIdentifier作为用户文档ID,因为它们被授予唯一性。
或者,您也可以使用由Raven(HiLo btw)生成的用户ID,并使用新的UniqueConstraintsBundle,它允许您将某些属性属性设置为唯一。在内部,它将创建一个额外的文档,其唯一属性的值为其id。