RavenDB 4 и Identities Id
Я только что обновил проект с RavenDB 3.5 до 4.0, и одно из самых больших изменений, которое я заметил, это то, как они меняют способ генерации идентификаторов.
В моем проекте большинство коллекций имеют базовую структуру идентификаторов, такую как "[имя коллекции]/[прогрессивный идентификатор]", где прогрессивный идентификатор представляет собой целое число, а не новый по умолчанию "[прогрессивный]-[узел]". Следуя документации, я указал идентификатор шаблона для новых документов как "[имя коллекции]|" и фактически генерирует уникальные / прогрессивные / целочисленные идентификаторы.
Проблема в том, что мне приходится сохранять 2 или более документов транзакциями и ссылаться на них между собой. Допустим, у меня есть два вида объектов:
Пользовательский объект
{
"Id": "users/1",
...
}
Адрес пользователя
{
"Id": "userAddresses/1",
"UserId": "users/1",
...
}
Где во втором документе мне нужно сослаться на первый через поле UserId.
До версии 4.0 я мог в той же транзакции сделать что-то вроде:
User newUser = new User();
session.Store(newUser)
UserAddress newUserAddress = new UserAddress();
newUserAddress.UserId = newUser.Id;
session.Store(newUserAddress);
session.SaveChanges();
После session.Store (newUser), если я получил доступ к свойству newUser.Id, я смог увидеть сгенерированный Id. Теперь я просто вижу "users|", мне нужно подождать после SaveChanges(), чтобы увидеть сгенерированные идентификаторы.
Такое поведение, по-видимому, происходит только для идентификаторов идентификаторов, если я использую структуру идентификатора "[имя коллекции]/[прогрессивный]-[узел]", я могу увидеть сгенерированный идентификатор сразу после Store().
Это по замыслу? Есть ли способ заставить старое поведение? ИЛИ Как я могу транзакционно управлять ситуацией, подобной этой, используя прогрессивные / целочисленные идентификаторы?
1 ответ
В RavenDB v4.0 у вас такое же поведение. После того, как вы позвоните session.Store(entity)
, или же await session.StoreAsync(entity)
для асинхронной сессии вы должны иметь entity.Id
заполнены с удостоверением личности.
Это установка идентификатора с использованием подхода HiLo, о котором вы можете прочитать здесь: https://ravendb.net/docs/article-page/4.0/Csharp/server/kb/document-identifier-generation
Единственное отличие в RavenDB v4.0 в том, что идентификатор будет выглядеть так: users/1-A
вместо users/1
в предыдущих версиях.