RavenDB: генерация идентификатора для поддокументов - PullRequest
13 голосов
/ 02 июля 2010

Я пытаюсь перенести существующее веб-приложение на RavenDB.

В настоящее время в моем веб-приложении есть страницы, которые позволяют просматривать категории, подкатегории и ресурсы на основе идентификатора в строке запроса.

Однако я заметил, что RavenDB генерирует идентификаторы для агрегатных корней, но не для дочерних объектов.

Я не думаю, что подкатегория - это совокупный корень (у категории есть подкатегории), поэтому я делаю ее вложенным документом в моем документе категории.

Неправильно ли я сделал его поддокументом, поскольку я получаю к нему доступ непосредственно по его идентификатору, переданному в строке запроса? Но если нет, то как мне получить доступ к отдельным подкатегориям, поскольку RavenDB, похоже, не генерирует идентификаторы для сущностей, которые не являются агрегированными корнями?

Ответы [ 2 ]

15 голосов
/ 08 июля 2010

В списке рассылки Raven есть длинная, но интересная дискуссия об этой конкретной ситуации.

Краткий ответ: Raven не предназначен для этого, только корневые сущности получают идентификатор, все остальное рассматривается как тип значения. Но вы можете реализовать это сами, см. Пример кода в конце потока для информации.

8 голосов
/ 07 января 2011

Я столкнулся с этой проблемой, но мне было неудобно позволить документам генерировать идентификаторы, так как я не чувствовал, что это потокобезопасно, особенно для веб-сред.

В конце концов я решил позволить серверусгенерируйте для меня идентификаторы, используя метод GenerateDocumentKey, например так:

using (var session = Store.OpenSession())
{
    if(category.SubCategories != null)
    {
       var newSubCategories = data.BankAccounts.Where(x => string.IsNullOrEmpty(x.Id));
        foreach (var sc in newSubCategories)
            sc.Id = session.Advanced.Conventions.GenerateDocumentKey(sc);    
    }

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

Таким образом, я разрешаю базе данных генерировать дочерние идентификаторы и могу гарантировать, что мне не придется обслуживать условия гонки и т. д.в самом классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...