Ravendb:サブドキュメントのID生成
-
02-10-2019 - |
質問
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を生成し、実際のクラス自体でレース条件などに対応する必要がないようにすることができます。