Ravendb: Идентификационная генерация для поддесположений
-
02-10-2019 - |
Вопрос
Я пытаюсь перенести существующее веб-приложение для использования RavendB.
В настоящее время у меня есть страницы в моей веб-приложении, которые позволяют просматривать категории, подкатегории и ресурсы на основе идентификатора в QueryString.
Однако я замечаю, что RavendB генерирует идентификаторы для совокупных корней, но не для детских объектов.
Я не думаю, что подкатегория - это совокупный корень (в категории есть подкатегории), поэтому делаю это поддесят документ моей категории.
Я ошибаюсь, чтобы сделать это поддесяцем, так как я доступа к нему напрямую, переданный его идентификатором, переданному в квитанции? Но если нет, как я должен получить доступ к индивидуальным подкатегориям, так как RavendB, похоже, не генерирует идентификаторы для объектов, которые не являются совокупными корнями?
Решение
Это долгое, но интересное обсуждение ВКЛ в списке рассылки ворона об этой точной ситуации.
Краткий ответ - это то, что raven не предназначен для этого, только корневые объекты получают удостоверение личности, все остальное рассматривается как тип значения. Но вы можете реализовать его самостоятельно, см. Образец кода в конце потока для информации.
Другие советы
Я столкнулся с этой проблемой, но не чувствовал себя комфортно, чтобы документы генерируют удостоверение личности, поскольку я не чувствовал, что это безопасно для потоков, особенно для веб-среды.
В конце концов я решил позволить серверу генерировать идентификатор для меня, используя метод 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();
}
Таким образом, я позволю в базу данных генерировать идентификатор ребенка и может гарантировать, что мне не придется удовлетворить условия гонок и т. Д. В самом актуальном классе.