Ошибка BulkInsert с RavenDB: идентификатор документа должен иметь непустое значение - PullRequest
0 голосов
/ 26 сентября 2018

Я использую операцию 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's .

При выполнении кода я получаю сообщение об ошибке:

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

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

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

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

1 Ответ

0 голосов
/ 26 сентября 2018

Для массовых операций вы должны либо оставить свойство 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();
  }
}
...