如何使用 RavenDb 默认 id 生成器获取连续 id

发布于 2024-11-08 03:40:49 字数 366 浏览 5 评论 0原文

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

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

  • posts/1
  • posts/2
  • posts/3
  • ...
  • posts/100

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

  • posts/1025
  • posts/1026
  • posts/1027

有帮助吗?

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

I'm evaluating RavenDB for a new project.

If i create 100 entities i got great consecutive ids like :

  • posts/1
  • posts/2
  • posts/3
  • ...
  • posts/100

But if i build a new DocumentStore instance (after App Restart) and try to create new entities i got strange ids like this :

  • posts/1025
  • posts/1026
  • posts/1027

Any help ?

Note : I'm using Embedded Server with ASP.NET MVC 3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

土豪我们做朋友吧 2024-11-15 03:40:49

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

为什么你关心连续的 id?

关于该主题,这也可能是一本不错的读物:http://groups。 google.com/group/ravendb/browse_thread/thread/3dbcacbc8b366ff8/

This is by design - new HiLo keys are generated whenever you create a DocumentStore instance, so the gaps you are seeing are the unused ids from the other session.

Why do you care for consecutive ids?

This may be a good read on the subject, too: http://groups.google.com/group/ravendb/browse_thread/thread/3dbcacbc8b366ff8/

苍白女子 2024-11-15 03:40:49

从 RavenDb 文档来看,您需要身份策略

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

例如。

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

session.Store(foo);
session.SaveChanges();

From the RavenDb documents, you're after the Identity strategy.

RavenDB also supports the notion of Identity, for example if you need
IDs to be consecutive. By creating a string Id property in your
entity, and setting it to a value ending with a slash (/), you can
tell RavenDB to use that as a key perfix for your entity. That prefix
followed by the next available integer ID for it will be your entity's
ID after you call SaveChanges().

eg.

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

session.Store(foo);
session.SaveChanges();
故事灯 2024-11-15 03:40:49

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

You might want to look at the identity option for RavenDB, but that isn't really something that you should care about.

旧伤还要旧人安 2024-11-15 03:40:49

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

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

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

You can set an identifier by your client, while still relying on the server to generate the identifier for you. It is done using the NextIdentityForCommand command:

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

This way you can use the identity value even in different field from Id. On the other hand, this makes creating a document slower, because you have to approach a server twice.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文