RavenDB的BulkInsert错误:文档ID必须具有非空值

时间:2018-09-26 13:00:42

标签: c# ravendb ravendb4

我正在使用RavenDB 4.0.6的BulkInsert操作插入一堆产品:

    using (var bulk = Store.BulkInsert())
    {
        foreach (var p in products)
        {
            p.Id = string.Empty; // <-- notice this
            await bulk.StoreAsync(p);
        }
    }

请注意,我通过显式提供string.Empty作为Id属性的值来故意跳过标识符创建策略。这基于RavenDB文档section Autogenerated ID's

运行代码时出现错误:

  

System.InvalidOperationException:文档ID必须具有非空值

此代码段直接在BulkInsertOperation.cs中产生。

我的问题是如何防止该错误,并且仍然保持与其他代码相同的ID生成策略?

例如我从未将Id属性设置为string.Empty以外的任何其他值。而且我担心将其设置为例如Guid.NewGuid.ToString()可能会导致其他问题(也请参见this question)。

1 个答案:

答案 0 :(得分:2)

对于批量操作,您必须将Id属性保留为null(非空字符串)以使其自动生成顺序ID,或者手动生成Guid ID。

批量插入和会话插入之间的API有点不一致:

using (var store = new DocumentStore() { Urls = new[] { "http://localhost:8080" } }.Initialize())
{
  using (var bulk = store.BulkInsert("Sample"))
  {
    bulk.Store(new SampleDocument { Name = "Bulk.Store Null Id", Id = null }); // Sequential Id (I.E. SampleDocuments/1-A)
    bulk.Store(new SampleDocument { Name = "Bulk.Store Blank Id", Id = "" }); // Throws Error
    bulk.Store(new SampleDocument { Name = "Bulk.Store Guid Id", Id = Guid.NewGuid().ToString() }); // Guid Id
  }

  using (var session = store.OpenSession("Sample"))
  {
    session.Store(new SampleDocument { Name = "Session.Store Null Id", Id = null }); // Sequential Id (I.E. SampleDocuments/2-A)
    session.Store(new SampleDocument { Name = "Session.Store Empty Id", Id = "" }); // Guid Id
    session.Store(new SampleDocument { Name = "Session.Store Guid Id", Id = Guid.NewGuid().ToString() }); // Guid Id
    session.SaveChanges();
  }
}