我目前的东西,应该是微不足道的挣扎,也许是的,但我不能找到一个体面的解决办法。
我的问题RavenDB默认ID结构起源。比方说,我们使用希洛算法创建一个人,我们会得到我们的第一个文件:
people/A-1
和相关集“人”现在有一个成员。
我的问题是非常简单的:设计一个正常的RESTful方法来获得一个人:
GET people/:id
而随着样本文档ID调用它,我的电话将变为:
GET people/people/A-1
这显然不行,因为反斜杠字符是路径分隔符,但RavenDB它也是实体ID的一部分。
我已经使用不同的分隔符(改变我的客户端代码的惯例)试过了,所以要得到这样的people#A-1
ID,但这不是由RavenDB工作室承认:如果我尝试“联系”两个文件一起通过自己的ID,只有标准格式得到认可。此外,我无法找到一个方法来设置在服务器级别的数据库上的惯例,但只能在客户端级别。
该解决方案还感觉像一个肮脏的解决办法,而我在寻找做事的正确方法。
我知道我可以使用任意的标识,如电子邮件地址没有任何前缀,但是这并不适用于所有类型的我要存储实体的可行的,自然的关键不是在每一个场景中的一个选项。
所以,我要问的人谁在使用RavenDB比我更有经验。什么是解决这个问题的正确方法?
我没有使用过ravendb玩具项目之外,但是,当我读ayendes本书,我认为这将是一个问题。我看到三种可能的方式来规避这一点:
我会用#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生成约定
我有同样的问题,我通过GUID改变文档ID生成策略。要生成文档ID,你需要通过string.Empty
in你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