2

RavenDB で奇妙な問題が発生しました

public ActionResult Save(RandomModel model)
{
//Do some stuff, validate model etc..

RavenSession.Store(model);
RavenSession.SaveChanges();


var newListOfModels = RavenSession.Query<RandomModel>().ToList();
return View("randomview",newListOfModels);
}

newListOfModels には、store メソッドで追加したばかりのモデルが含まれていません。

ただし、savechanges の後に Thread.Sleep(100) を追加すると、保存されたモデルが新しいリストに含まれます。

RavenDB への保存と保存の方法が間違っていますか?

どうすればいいですか?

もちろん、受信モデルを newListOfModels に追加し、たとえば basecontrollers の onactionexecuted メソッドで SaveChanges を実行するだけの回避策があります。

私の主な関心事は、ドキュメントセッションをクエリしてそこに新しく追加されたモデルを見つける前に、スレッドを遅らせる必要がある理由です。

4

1 に答える 1

6

RavenDB インデックスは、その性質上、古くなります。ドキュメントから

RavenDB はバックグラウンド スレッドでデータのインデックス作成を実行します。これは、新しいデータが入ってくるか、既存のデータが更新されるたびに実行されます。これをバックグラウンド スレッドとして実行すると、大量のデータが変更された場合でもサーバーは迅速に応答できますが、その場合、古いインデックスをクエリする可能性があります。

そのため、クエリを実行するときに RavenDB に、インデックスが再表示されるまで待機するように指示する必要があります。

さまざまなWaitFor...カスタマイズを行うことができますが、おそらくWaitForNonStaleResultsAsOfLastWrite次のオプションが必要になるでしょう。

var newListOfModels = RavenSession
    .Query<RandomModel>()
    .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()).ToList();
于 2012-11-05T19:55:05.490 に答える