我目前正在努力解决一些应该是微不足道的事情,也许是这样,但我找不到合适的解决方案。
我的问题源于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。解决这个问题的正确方法是什么?
答案 0 :(得分:2)
我没有在玩具项目之外使用过ravendb,但是当我读到ayendes书时,我认为这将是一个问题。 我认为有三种可能的方法可以避免这种情况:
我认为我会使用#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