2

我刚刚将一个项目从 RavenDB 3.5 升级到 4.0,我注意到的最大变化之一是它们改变了 Id 的生成方式。

在我的项目中,大多数集合都有一个基本的 id 结构,如“[collection name]/[progressive id]”,其中progressive id 是一个整数,而不是新的默认值“[progressive]-[node]”。根据文档,我将新文档的模式 ID 指定为“[集合名称]|” 并且实际上正在生成唯一/渐进/整数ID。

问题是当我必须以事务方式保存 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。现在我只看到“用户|”,我必须在 SaveChanges() 之后等待才能看到生成的 Id。

这种行为似乎只发生在 Identities Id 上,如果我使用 id 结构“[collection name]/[progressive]-[node]”,我可以在 Store() 之后立即看到生成的 id。

是设计使然吗?有没有办法强制旧行为?或者我如何使用渐进式/整数 id 以事务方式管理像这样的情况?

4

1 回答 1

3

在 RavenDB v4.0 中,您具有相同的行为。在你调用到session.Store(entity)await session.StoreAsync(entity)异步会话之后,你应该已经entity.Id填写了 ID。

它使用 HiLo 方法设置 ID,您可以在此处阅读: https ://ravendb.net/docs/article-page/4.0/Csharp/server/kb/document-identifier-generation#hilo-algorithm

RavenDB v4.0 中 ID 的唯一区别是:users/1-A而不是users/1以前的版本。

于 2018-03-12T11:53:10.170 回答