9

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

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

people/A-1

并且相关的集合“人”现在有一个成员。

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

GET people/:id

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

GET people/people/A-1

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

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

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

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

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

4

3 回答 3

2

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

  1. 分配一个 guid 作为 id,这样你的 id 中就没有 / 。这可以在文档创建时完成
  2. 在每个控制器方法上用不太糟糕的东西替换“/”,这很烦人并且容易出错。
  3. Url-在生成 URL 时转义 id 部分。

我想我会使用#1。

于 2018-04-27T13:33:13.733 回答
2

您只能将 传递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 生成约定

于 2018-04-16T14:59:54.140 回答
1

我有同样的问题,我通过 GUID 更改了文档 ID 生成策略。要将文档 ID 生成为 GUID,您需要传入实体string.EmptyId属性。

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://ravenb.net/docs/article-page/4.1/csharp/server/kb/document-identifier-generation

于 2019-02-03T01:00:57.583 回答