RavenDB ID前缀和REST API

问题描述 投票:8回答:3

我目前的东西,应该是微不足道的挣扎,也许是的,但我不能找到一个体面的解决办法。

我的问题RavenDB默认ID结构起源。比方说,我们使用希洛算法创建一个人,我们会得到我们的第一个文件:

people/A-1

和相关集“人”现在有一个成员。

我的问题是非常简单的:设计一个正常的RESTful方法来获得一个人:

GET people/:id

而随着样本文档ID调用它,我的电话将变为:

GET people/people/A-1

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

我已经使用不同的分隔符(改变我的客户端代码的惯例)试过了,所以要得到这样的people#A-1 ID,但这不是由RavenDB工作室承认:如果我尝试“联系”两个文件一起通过自己的ID,只有标准格式得到认可。此外,我无法找到一个方法来设置在服务器级别的数据库上的惯例,但只能在客户端级别。

该解决方案还感觉像一个肮脏的解决办法,而我在寻找做事的正确方法。

我知道我可以使用任意的标识,如电子邮件地址没有任何前缀,但是这并不适用于所有类型的我要存储实体的可行的,自然的关键不是在每一个场景中的一个选项。

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

c# nosql ravendb ravendb-studio
3个回答
2
投票

我没有使用过ravendb玩具项目之外,但是,当我读ayendes本书,我认为这将是一个问题。我看到三种可能的方式来规避这一点:

  1. 指定一个GUID作为ID,这样一来,你只是不/在你的IDS。这可以在文档创建完成
  2. 替换“/”的东西在每个控制器方法不那么糟糕,这是烦人,而且容易出错。
  3. 生成URL时URL的逃脱ID部分。

我会用#1,我认为。


1
投票

因为把PeopleController意味着你会与人一起工作,然后你可以将前缀添加到使用RavenDB功能ID您可以通过只1-A于收到请求的控制器:

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

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

否则,你可以改变这种类型的ID生成约定


0
投票

我有同样的问题,我通过GUID改变文档ID生成策略。要生成文档ID,你需要通过string.Emptyin你Id你的实体的财产GUID。

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

© www.soinside.com 2019 - 2024. All rights reserved.