1

RavenDB の DocumentConvention API を利用して、ドメイン オブジェクトに増分 ID を自動的に設定しようとしています。

IDocumentStore で次のコード行を使用すると、これが完全に機能します。

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

これにより、ID がまだ設定されていない新しい User オブジェクトを保存するたびに、 " users/1""users/2"などのユーザー オブジェクトの連続した ID が作成されます。

ただし、非同期ドキュメント セッションでこれを実行したいのですが、RegisterAsyncIdConvention()を呼び出すときにセッションから「次の ID」を取得する方法に関するドキュメントを見つけることができませんでした...

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

... NextIdentityForIAsyncDatabaseCommandsインターフェイスで使用できないため、コンパイルされません。

誰でもヒントを教えてもらえますか?誰もこれをやろうとしましたか?

ありがとう。

4

1 に答える 1

5

シーケンシャル ID で説明した動作は、既にデフォルトになっています。この動作を実現するために、規則で特別なことをする必要はありません。

非同期セッションでも機能しますが、元々、最初に保存されたときに id プロパティの値を実際に設定していませんでした。これは、このスレッドのメーリング リストで議論されました。プル リクエストが最新の不安定版ビルドに組み込まれたと思いますが、確認していません。

更新 (コメントから)

デフォルトでは、型名の複数形を使用するのが規則です。型名が単一の単語の場合、小文字で返されます。複数の単語がある場合、大文字と小文字は保持されます。

検討:

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

この規則を変更したい場合は、新しいラムダ関数を指定するだけです:

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

以前と同じコードを実行すると、次のようになります。

user/1
foobar/1

しかし、複数形を維持し、すべて小文字にしたい場合がありますか?

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

出力:

users/1
foobars/1

たぶん、常に PascalCase が必要ですか?

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
于 2013-03-18T21:06:50.823 に答える