RavenDB: Генерация идентификаторов для дополнительных документов

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

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

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

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

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


person Andy    schedule 02.07.2010    source источник


Ответы (2)


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

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

person Matt Warren    schedule 07.07.2010
comment
Спасибо, Мэтт. Это точно описывает мою ситуацию. Я проголосую за ваш ответ, когда у меня будет достаточно репутации. - person Andy; 08.07.2010

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

В конце концов я решил позволить серверу генерировать идентификаторы для меня, используя метод 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();
}

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

person lomaxx    schedule 07.01.2011
comment
Обратите внимание, что сейчас это Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey(sc) - person Ben Foster; 06.03.2012