【问题标题】:RavenDB 4 and Identities IdRavenDB 4 和身份 ID
【发布时间】:2018-03-12 19:53:10
【问题描述】:

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

在我的项目中,大多数集合都有一个基本的 id 结构,例如“[collection name]/[progressive id]”,其中progressive id 是一个整数,而不是新的默认值“[progressive]-[node]” . 在documentation 之后,我将新文档的模式 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。现在我只看到“users|”,我必须在 SaveChanges() 之后等待才能看到生成的 Id。

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

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

【问题讨论】:

    标签: ravendb identity transactional ravendb4


    【解决方案1】:

    在 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

    【讨论】:

    • 这是问题所在:我需要它也适用于身份 ID。我已经测试了默认模式并且像以前一样工作。但是,当我使用“用户”管道格式只包含整数时,它不再工作了......
    • @tanathos 与 3.5 一样,使用身份时,您必须等待 SaveChanges 调用。如果你想使用没有节点标签的数字id,可以使用AsyncHiLoIdGenerator,然后覆盖GetDocumentIdFromId,见github.com/ravendb/ravendb/blob/…
    • @AyendeRahien 谢谢你的回答,我会这样尝试。无论如何你说的很奇怪,我确定在 Store() 之后的 3.5 中我已经有了我的渐进式 ID(使用模式“[collection]/”生成)。否则,我的应用程序将根本无法工作。它可能与某些配置有关吗?
    • 我写了相关代码,如果你用collection/,只有SaveChanges()之后才有。
    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2023-01-26
    • 1970-01-01
    • 2017-08-25
    • 2017-12-22
    相关资源
    最近更新 更多