在RavenDB中的RegisterIdConventionx异步

本文关键字:异步 RegisterIdConventionx 中的 RavenDB | 更新日期: 2023-09-27 18:04:27

我试图利用RavenDB的DocumentConvention API在我的域对象上自动设置增量ID。

我使用IDocumentStore上的这行代码完美地工作:

DocumentStore.Conventions.RegisterIdConvention<User>
    ((dbname, commands, user) => "users/" + commands.NextIdentityFor("users"));

每当我存储一个没有ID设置的新user对象时,这将创建我的用户对象的顺序ID, "users/1""users/2"等。

然而,我想这样做一个Async文档会话,但还没有能够找到任何文档如何获得"下一个身份"从会话时调用RegisterAsyncIdConvention()

docStore.Conventions.RegisterAsyncIdConvention<User>
    ((dbname, commands, user) => "users/" + commands.NextIdentityFor("users"));

…无法编译,因为NextIdentityFor iasyncdatabasecommand 接口上不可用。

有谁能给我一点提示吗?有人试过这么做吗?

谢谢。

在RavenDB中的RegisterIdConventionx异步

您用顺序id描述的行为已经是默认的。你不需要做任何特殊的约定来获得这种行为。

它也适用于异步会话-但最初它并没有在第一次存储时实际设置id属性的值。这个问题在邮件列表中讨论过。我相信拉取请求使它成为最新的不稳定构建,但我没有验证。

Update (from comments)

默认情况下,约定是使用类型名的复数形式。如果类型名称是单个单词,则以小写形式返回。如果它有多个单词,则保留大小写。

考虑:

var user = new User { Name = "Joe" };
session.Store(user);
var fooBar = new FooBar { Name = "Whatever" };
session.Store(fooBar);
Debug.WriteLine(user.Id);
Debug.WriteLine(fooBar.Id);

在不改变约定的情况下,将输出:

users/1
FooBars/1

如果您想更改此约定,只需提供一个新的lambda函数:

documentStore.Conventions.FindTypeTagName = type => type.Name.ToLower();

运行与前面相同的代码,现在您将得到:

user/1
foobar/1

但是也许你想保留复数形式,只是想要全部小写?

documentStore.Conventions.FindTypeTagName = type =>
              DocumentConvention.DefaultTypeTagName(type).ToLower();

输出:

users/1
foobars/1

也许你只是想要PascalCase always?

documentStore.Conventions.FindTypeTagName = type =>
{
    var s = DocumentConvention.DefaultTypeTagName(type);
    return s.Substring(0, 1).ToUpper() + s.Substring(1);
};

输出:

Users/1
FooBars/1

或者骆驼总是这样?

documentStore.Conventions.FindTypeTagName = type =>
{
    var s = DocumentConvention.DefaultTypeTagName(type);
    return s.Substring(0, 1).ToLower() + s.Substring(1);
};

输出:

users/1
fooBars/1