RavenDB ID前缀和REST API

时间:2018-04-16 13:51:56

标签: c# nosql ravendb ravendb-studio

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

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

people/A-1

相关系列“人物”现在有一名成员。

我的问题非常简单:设计一个普通的RESTful方法来获取一个人:

GET people/:id

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

GET people/people/A-1

这显然不起作用,因为斜杠字符是路由分隔符,但是使用RavenDB它也是实体ID的一部分。

我尝试使用不同的分隔符(更改我的客户端代码的约定),因此要获取类似people#A-1的ID,但RavenDB Studio无法识别:如果我尝试“链接”两个文档根据他们的ID,只有标准格式被识别。此外,我找不到在服务器级别设置数据库约定的方法,但仅限于客户端级别。

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

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

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

3 个答案:

答案 0 :(得分:2)

我没有在玩具项目之外使用过ravendb,但是当我读到ayendes书时,我认为这将是一个问题。 我认为有三种可能的方法可以避免这种情况:

  1. 指定一个guid作为id,这样你就没有/在你的id中。这可以在文档创建时完成
  2. 将“/”替换为每个控制器方法上较不糟糕的东西,这很烦人且容易出错。
  3. 生成URLS时,url-escape id部分。
  4. 我认为我会使用#1。

答案 1 :(得分:1)

您只能将1-A传递给接收请求的控制器,因为PeopleController意味着您将使用People,然后您可以使用RavenDB函数将该前缀添加到id:

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

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

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

答案 2 :(得分:0)

我遇到了同样的问题,我通过GUID更改了文档ID生成策略。要将文档ID生成为GUID,您需要在实体的string.Empty属性中传递Id

var branch = new Branch.Model.Branch()
{
   Id = string.Empty,
   Name = request.Name,
   Address = request.Address,
   ContactNo = request.ContactNo,
   Email = request.Email
};

await _session.StoreAsync(branch, cancellationToken);
await _session.SaveChangesAsync(cancellationToken);

在RavenDB中,服务器支持四个选项来存储文档并为其分配标识符https://ravendb.net/docs/article-page/4.1/csharp/server/kb/document-identifier-generation