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 в предыдущих версиях.

Другие вопросы по тегам