Ravendb4和身份Id
我刚刚将一个项目从Ravendb3.5升级到4.0,我注意到其中一个最大的变化是它们改变了ID生成的方式 在我的项目中,大多数集合都有一个基本的id结构,如“[collection name]/[progressive id]”,其中progressive id是一个整数,而不是新的默认值“[progressive]-[node]”。 在之后,我将新文档的模式id指定为“[collection name]|”,并实际生成唯一/渐进/整数id 问题是当我必须以事务方式保存两个或多个文档并在它们之间引用它们时。假设我有两种物体: 用户实体Ravendb4和身份Id,ravendb,identity,transactional,ravendb4,Ravendb,Identity,Transactional,Ravendb4,我刚刚将一个项目从Ravendb3.5升级到4.0,我注意到其中一个最大的变化是它们改变了ID生成的方式 在我的项目中,大多数集合都有一个基本的id结构,如“[collection name]/[progressive id]”,其中progressive id是一个整数,而不是新的默认值“[progressive]-[node]”。 在之后,我将新文档的模式id指定为“[collection name]|”,并实际生成唯一/渐进/整数id 问题是当我必须以事务方式保存两个或多个文档并在它们之间
{
"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
这种行为似乎只发生在标识id上,如果我使用id结构“[collection name]/[progressive]-[node]”,我就可以在Store()之后看到生成的id
这是设计的吗?有没有办法强迫旧的行为?
或者,我如何使用渐进式/整数ID以事务方式管理这种情况?在RavenDB v4.0中,您也有同样的行为。在调用异步会话的
session.Store(entity)
或wait session.StoreAsync(entity)
后,应在entity.Id中填入Id
它使用HiLo方法设置ID,您可以在此处阅读:
RavenDB v4.0中唯一的区别是ID类似于:users/1-A
而不是以前版本中的users/1
。这就是问题所在:我需要它也适用于身份ID。我已经测试了默认模式,并且正在像以前一样工作。但由于我使用“用户”管道格式只包含整数,因此不再有效…@tanathos如3.5中所述,在使用标识时,您必须等待SaveChanges
调用。如果您想使用不带节点标记的数字ID,可以使用AsyncHiLoIdGenerator
,然后覆盖GetDocumentIdFromId
,请参阅@AyendeRahien谢谢您的回答,我会这样尝试。无论如何,你说的很奇怪,我确信在3.5版本中,在Store()之后,我已经有了我的渐进式Id(使用“[collection]/”模式生成)。否则,我的申请根本不起作用。它可能与某些配置有关吗?我编写了相关代码,如果您使用了collection/
,则它仅在SaveChanges()之后可用。