如何获取连续 ID 与 RavenDb 默认 id 生成器

本文关键字:默认 RavenDb id ID 何获取 获取 连续 | 更新日期: 2023-09-27 17:56:40

我正在为一个新项目评估RavenDB。

如果我创建 100 个实体,我会得到很棒的连续 ID,例如:

  • 帖子/1
  • 帖子/2
  • 帖子/3
  • 帖子/100

但是,如果我构建一个新的 DocumentStore 实例(在应用程序重新启动后)并尝试创建新实体,我会得到这样的奇怪 ID:

  • 帖子/1025
  • 帖子/1026
  • 帖子/1027

有什么帮助吗?

注意:我正在使用带有 ASP.NET MVC 3的嵌入式服务器

如何获取连续 ID 与 RavenDb 默认 id 生成器

这是设计使然 - 每当您创建 DocumentStore 实例时都会生成新的 HiLo 密钥,因此您看到的间隙是来自其他会话的未使用 ID。

你为什么关心连续的ID?

这也可能是关于这个主题的好读物:http://groups.google.com/group/ravendb/browse_thread/thread/3dbcacbc8b366ff8/

从 RavenDb 文档中,您正在追求身份策略。

RavenDB还支持Identity的概念,例如,如果您需要 要连续的 ID。通过在 实体,并将其设置为以斜杠 (/) 结尾的值,您可以 告诉 RavenDB 将其用作实体的键 perfix。该前缀 后跟下一个可用的整数 ID,因为它将是您的实体的 调用 SaveChanges() 后的 ID。

例如。

var foo = new Foo();
foo.Id = "foo/"; // <-- this will use the Identity strategy, not HiLo.
session.Store(foo);
session.SaveChanges();

你可能想看看RavenDB的标识选项,但这并不是你应该关心的事情。

您可以由客户端设置标识符,同时仍依赖服务器为您生成标识符。它是使用 NextIdentityForCommand 命令完成的:

var command = new NextIdentityForCommand("<<your collection name>>");
Session.Advanced.RequestExecutor.Execute(command, Session.Advanced.Context);
var id = command.Result;

这样,即使在与 Id 不同的字段中,您也可以使用标识值。另一方面,这使得创建文档的速度变慢,因为您必须两次接近服务器。