【问题标题】:How-To get consecutive id with RavenDb default id generator如何使用 RavenDb 默认 id 生成器获取连续 id
【发布时间】:2011-05-18 08:16:58
【问题描述】:

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

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

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

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

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

有什么帮助吗?

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

【问题讨论】:

  • 如果连续的 ID 对您很重要,那么您通常做错了什么。
  • 有时对我来说似乎是合理的。例如,发票编号应该是连续的、唯一的和不变的。在某些情况下,这似乎是一个合理的身份。或者您会始终使用代理ID,然后以其他方式手动生成顺序发票编号?

标签: c# .net ravendb


【解决方案1】:

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

为什么要关心连续的 id?

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

【讨论】:

    【解决方案2】:

    来自 RavenDb 文档,you're after the Identity strategy

    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();
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2020-06-22
          • 2017-09-02
          • 2011-03-11
          • 1970-01-01
          • 2018-09-29
          • 2016-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多