RavenDB: создание идентификатора для суб-документов
Я пытаюсь перенести существующее веб-приложение на использование RavenDB.
В настоящее время у меня есть страницы в моем веб-приложении, которые позволяют просматривать категории, подкатегории и ресурсы на основе идентификатора в запросе.
Однако я замечаю, что RavenDB генерирует идентификаторы для совокупных корней, но не для дочерних объектов.
Я не думаю, что подкатегория является агрегированным корнем (категория имеет SubCategories), поэтому я делаю ее поддокумом моего документа категории.
Неужели я ошибаюсь, чтобы сделать его суб-документом, поскольку я обращаюсь к нему напрямую по его идентификатору, переданному в querystring? Но если нет, как я должен обращаться к отдельным подкатегориям, поскольку RavenDB, похоже, не генерирует идентификаторы для объектов, которые не являются совокупными корнями?
Ответы
Ответ 1
Там длинная, но интересная дискуссия в списке рассылки Raven об этой точной ситуации.
Короткий ответ заключается в том, что Raven не предназначен для этого, только корневые объекты получают идентификатор, все остальное рассматривается как тип значения. Но вы можете реализовать его самостоятельно, см. Образец кода в конце потока для информации.
Ответ 2
Я столкнулся с этой проблемой, но мне было неудобно позволить документам генерировать идентификатор, поскольку я не чувствовал, что он безопасен потоком, особенно для веб-сред.
В конце концов я решил позволить серверу генерировать идентификатор для меня, используя метод 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();
}
Таким образом я разрешаю базе данных генерировать идентификатор дочернего элемента и может гарантировать, что мне не придется обслуживать условия гонки и т.д. в самом самом классе.