c# - 为什么 Raven 会为我的新文档生成一个已经存在的文档 ID?

标签 c# ravendb

为什么这段代码(试图)用第二个对象覆盖我的第一个对象?我的第一个对象特别有一个 Id 为“StringBasedIdClasses/1”,而第二个对象没有提供 Id,所以 Raven 应该生成一个未使用的 Id,不是吗?

 var quickStore = new EmbeddableDocumentStore() { RunInMemory = true };
 quickStore.Initialize();
 quickStore.RegisterListener(new DocumentConversionListener()).RegisterListener(new DocumentStoreListener());

 using (var session = quickStore.OpenSession())
 {
      session.Advanced.UseOptimisticConcurrency = true;
      var stringIdTest = new StringBasedIdClass()
      {
           Id = "StringBasedIdClasses/1",
           Name = "StringItem1"
      };

      session.Store(stringIdTest);
      session.SaveChanges();
 }

 using (var session = quickStore.OpenSession())
 {
      session.Advanced.UseOptimisticConcurrency = true;
      var stringIdTest = new StringBasedIdClass()
      {
           Name = "DidIReplaceYou"
      };

      session.Store(stringIdTest);
      session.SaveChanges();//This fails with a ConcurrencyViolation as I use OptimisticConcurrency and have Etag support on my objects
 }

一切都在使用文档存储的一个当前实例。这看起来很基础,所以一定是漏掉了一些简单的东西。

最佳答案

好的,部分答案是 Thomas 所说的,但更具体地说,RavenDb 完全忽略您手动插入的 ID。为了进行批量导入(比如像我正在做的那样将数据从旧系统迁移到新系统,您需要执行以下操作:

  1. 确保处理连接到该数据库的所有文档存储(通常这意味着,不要让您的应用程序运行
  2. 批量导入系统,自己设置 id(您有责任确保不覆盖任何现有记录,但您可以为此使用乐观并发和 etags)
  3. 在导入结束时,使用以下代码将集合的 hilo(基本上是新 ID 的起点)设置为高于系统中当前最高 ID 的值:

    session.Store(new {Id = "Raven/Hilo/{yourcollectionname}", Max = newMaxValue});
    session.SaveChanges(); 
    
  4. 现在当您初始化新商店时,将使用正确的 hilo 值。

请注意,此过程无法使用 EmbeddableDocumentStore 的内存版本来模拟,因为您每次打开商店时都会创建一个全新的服务器实例。因此,如果您尝试假设现有/非现有记录的已知 ID 进行集成测试,则必须让 Raven 选择 ID,而不是将它们设置在您自己的对象中。这应该可以正常工作,因为您的新内存存储总是从 1 开始。为了确保测试的隔离,我为每个测试都开了一个新商店。

关于c# - 为什么 Raven 会为我的新文档生成一个已经存在的文档 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23936312/

相关文章:

c# - 如何使用反射在私有(private)方法中使用私有(private)枚举?

c# - Web 应用程序项目 - 如何使用 ProfileCommon

c# - C# 中的 Java MessageDigest 类

c# - 即使对象具有值,ASP.NET MVC 5 Razor 也会抛出 'Nullable object must have a value'

c# - 如何使用 ITextSharp 获取 PDF 中嵌入图像的分辨率

c# - 在 RavenDb 中映射减少 2 个带有子集合的集合

linux - 如何从 Linux Docker 容器中的网络共享恢复 nuget 包

indexing - RavenDb静态索引: query on child collection objects

RavenDB 补丁 API : updating a nested collection

linq - 比较 RavenDb 中 Where 子句中同一实体的两个属性