RavenDB 4和身份标识

时间:2018-03-12 11:15:40

标签: ravendb identity transactional ravendb4

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

在我的项目中,大多数集合都有一个基本的id结构,如" [集合名称] / [progressive id]",其中progressive标识是一个整数,而不是新的默认值&#34 [逐行] - [节点]&#34 ;. 在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。现在我只看到"用户|",我在SaveChanges()之后等待查看生成的ID。

如果我使用id结构" [集合名称] / [progressive] - [node]"这种行为似乎只发生在Identities Ids上。我能够在Store()之后看到生成的ID。

是否按设计?有没有办法强迫旧的行为? 或者如何使用渐进/整数ID管理事务处理这样的情况?

1 个答案:

答案 0 :(得分: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