質問

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

現在、Webアプリケーションにページがあり、クエリストリングのIDに基づいてカテゴリ、サブカテゴリ、リソースを表示できます。

ただし、RavendBは総根のIDを生成しますが、子エンティティでは生成されません。

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

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

役に立ちましたか?

解決

あります 長くて興味深い議論 この正確な状況についてのレイヴンメーリングリストの上にあります。

簡単な答えは、レイヴンがこれを行うように設計されておらず、ルートエンティティのみがIDを取得し、他のすべてが値タイプとして扱われるということです。ただし、自分で実装できます。スレッドの最後にあるコードサンプルを参照してください。

他のヒント

私はこの問題に出くわしましたが、特にWebベースの環境ではスレッドが安全だとは感じなかったため、ドキュメントにIDを生成させることに不安がありませんでした。

最終的に、私はサーバーが私のためにIDを生成させて、次のようなgenedocumentkeyメソッドを使用してもらうことにしました。

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を生成し、実際のクラス自体でレース条件などに対応する必要がないようにすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top