BulkInsert ошибка с RavenDB: идентификатор документа должен иметь непустое значение

Я использую операцию BulkInsert RavenDB 4.0.6, чтобы вставить несколько продуктов:

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

Обратите внимание, что я намеренно пропускаю стратегию создания идентификатора, явно предоставляя string.Empty в качестве значения свойства Id. Это основано на документах RavenDB, раздел Autogenerated ID.

При запуске кода я получаю ошибку:

System.InvalidOperationException: идентификатор документа должен иметь непустое значение

Который напрямую создается этим codenippet в BulkInsertOperation.cs.

Мой вопрос заключается в том, как я могу предотвратить эту ошибку и сохранить ту же стратегию генерации идентификаторов, что и мой другой код?

Например, я никогда не устанавливал для свойства Id ничего, кроме string.Empty, И я боюсь, что установка его, например, Guid.NewGuid.ToString() может вызвать другие проблемы (см. также этот вопрос).

1 ответ

Решение

Для массовых операций вы должны либо оставить свойство Id пустым (не пустой строкой), чтобы оно автоматически генерировало последовательный идентификатор, либо сгенерировать идентификатор Guid вручную.

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();
  }
}
Другие вопросы по тегам