c# - RavenDB ID 前缀和 REST API

标签 c# nosql ravendb ravendb-studio

我目前正在为一些应该微不足道的事情而苦苦挣扎,也许是这样,但我找不到合适的解决方案。

我的问题源于 RavenDB 默认 ID 结构。假设我们使用 HiLo 算法创建一个人,我们将得到我们的第一个文档:

people/A-1

相关集合“People”现在有一个成员。

我的问题真的很简单:设计一个普通的 RESTful 方法来获得一个人:

GET people/:id

并使用示例文档 ID 调用它,我的调用将变为:

GET people/people/A-1

这显然行不通,因为斜杠字符是路由分隔符,但对于 RavenDB,它也是实体 ID 的一部分。

我已经尝试使用不同的分隔符(更改我的客户端代码的约定),以便获得像 people#A-1 这样的 ID,但这不能被 RavenDB Studio 识别:如果我尝试通过 ID 将两个文档“链接”在一起,只有标准格式才能被识别。此外,我找不到在服务器级别设置数据库约定的方法,只能在客户端级别设置。

这个解决方案也感觉像是一个肮脏的解决方法,我正在寻找正确的做事方式。

我知道我可以使用任意 ID,例如没有任何前缀的电子邮件地址,但这对于我要存储的所有类型的实体都是不可行的,自然键并不是在所有情况下都适用。

所以我问任何在使用 RavenDB 方面比我更有经验的人。解决这个问题的正确方法是什么?

最佳答案

您可以仅将 1-A 传递给接收请求的 Controller ,因为 PeopleController 暗示您将与 People 一起工作,然后您可以使用 RavenDB 函数将前缀添加到 id:

var collectionName = documentStore.Conventions.FindCollectionName(typeof(People));
var idPrefix = documentStore.Conventions.TransformTypeCollectionNameToDocumentIdPrefix(collectionName);

var id = idPrefix +"/"+ "1-A";

否则您可以更改该类型的 id 生成约定

关于c# - RavenDB ID 前缀和 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49858989/

相关文章:

RavenDB 轮询的替代方案(推送通知)

c# - 为什么我调用 Twitter 用户时间线返回 "401 Unauthorized."?

elasticsearch - 跳过Elasticsearch搜索结果中的字段重复项

redis - 在 Redis/NoSQL 或关系数据库中存储大量数据?

c# - RavenDB 附件 - 功能怎么做?

ravendb - 如何更新 Ravendb 数组中的值?我需要使用查询

c# - ASP :NET MVC Route Config allow #

c# - C 类 : A : B 时访问同名成员

c# - 从 WPF 中的数据绑定(bind)数据网格中排除列

ravendb - 我应该如何为 RavenDB 中的文档建模这种关系?