13

RavenDB を使用するために、既存の Web アプリケーションを移行しようとしています。

現在、私の Web アプリケーションには、クエリ文字列の ID に基づいてカテゴリ、サブカテゴリ、およびリソースを表示できるページがあります。

ただし、RavenDB は集約ルートの ID を生成しますが、子エンティティの ID は生成しないことに気付きました。

サブカテゴリは集約ルート (カテゴリにはサブカテゴリがあります) ではないと思うので、カテゴリ ドキュメントのサブドキュメントにしています。

クエリ文字列で渡された ID で直接アクセスしているため、サブドキュメントにするのは間違っていますか? しかし、そうでない場合、RavenDB は集約ルートではないエンティティの ID を生成しないように見えるため、個々のサブカテゴリにアクセスするにはどうすればよいですか?

4

2 に答える 2

14

この正確な状況については、Ravenメーリングリストで長いが興味深い議論があります。

簡単に言うと、Ravenはこれを行うようには設計されておらず、ルートエンティティのみがIDを取得し、それ以外はすべて値型として扱われます。ただし、自分で実装することもできます。詳細については、スレッドの最後にあるコードサンプルを参照してください。

于 2010-07-07T21:47:27.867 に答える
8

私はこの問題に遭遇しましたが、特に Web ベースの環境では、スレッドセーフであるとは思わなかったため、ドキュメントに ID を生成させることに満足していませんでした。

最終的に、次のような GenerateDocumentKey メソッドを使用して、サーバーに ID を生成させることにしました。

using (var session = Store.OpenSession())
{
    if(category.SubCategories != null)
    {
       var newSubCategories = data.BankAccounts.Where(x => string.IsNullOrEmpty(x.Id));
        foreach (var sc in newSubCategories)
            sc.Id = session.Advanced.Conventions.GenerateDocumentKey(sc);    
    }

    session.Store(data);
    session.SaveChanges();
}

このようにして、データベースが子 ID を生成できるようにし、実際のクラス自体で競合状態などに対応する必要がないようにすることができます。

于 2011-01-07T05:40:08.040 に答える