6

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

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

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

但是,如果我构建一个新的 DocumentStore 实例(在 App Restart 之后)并尝试创建新实体,我会得到如下奇怪的 id:

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

有什么帮助吗?

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

4

4 回答 4

8

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

为什么要关心连续的 id?

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

于 2011-05-18T09:09:04.220 回答
7

从 RavenDb 文档中,您可以使用 Identity strategy

RavenDB 还支持身份的概念,例如,如果您需要连续的 ID。通过在实体中创建字符串 Id 属性,并将其设置为以斜杠 (/) 结尾的值,您可以告诉 RavenDB 将其用作实体的键前缀。在您调用 SaveChanges() 后,该前缀后跟下一个可用的整数 ID 将是您的实体 ID。

例如。

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

session.Store(foo);
session.SaveChanges();
于 2012-05-25T05:32:24.537 回答
3

您可能想查看 RavenDB 的身份选项,但这并不是您真正应该关心的事情。

于 2011-05-18T13:36:31.977 回答
0

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

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

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

于 2022-01-19T13:56:00.047 回答