2011-08-13 3 views
0

RavenDBの学習の一環として、夜間にダウンロードしたリストに基づいて、株式のコレクションを更新しようとしています。RavenDB:非同期SaveChangesは、それ以降のアップデートに影響しますか?

public class Stock 
{ 
    public string Id { get; set; } 
    public StockStatus Status { get; set; } 
} 

私は、このアルゴリズムでリストを同期しようとしている: "ようになりましたダウンロードされたすべての株式を

  1. 更新または挿入

    私はIdが銘柄記号であるストッククラスを持っていますStillActive "である。

  2. 前回から「アクティブ」のステータスを持つ株は、更新に含まれていないことを意味し、「削除済み」である必要があります。
  3. すべての株式はまだ "StillActive"が新しい "アクティブ"株になります。ここで

実装です:

List<Stock> stocks = DownloadStocks(); 

using (var session = RavenContext.Store.OpenSession()) 
{ 
    foreach (Stock stock in stocks) 
    { 
     stock.Status = StockStatus.StillActive; 
     session.Store(stock); 
    } 

    session.SaveChanges(); 

    session.PatchUpdateCutoffNow("Stocks/ByStatus", "Status:Active", "Status", StockStatus.Deleted); 
    session.PatchUpdateCutoffNow("Stocks/ByStatus", "Status:StillActive", "Status", StockStatus.Active); 
} 

PatchUpdateCutoffNowは今のカットオフとUpdateByIndexを行う拡張メソッドです:

public static void PatchUpdateCutoffNow(this IDocumentSession session, string indexName, string query, string name, object val) 
{ 
    session.Advanced.DatabaseCommands.UpdateByIndex(indexName, 
     new IndexQuery() { Query = query, Cutoff = DateTime.Now }, 
     new[] 
     { 
      new PatchRequest 
      { 
       Type = PatchCommandType.Set, 
       Name = name, 
       Value = val.ToString() 
      } 
     }); 
} 

私がいることを、削除済み株式の多くで終わりますしてはいけません。私の推測では、SaveChangesは非同期で、PatchUpdateCutoffNowが開始するまでに完了しないため、「アクティブ」にする必要があるときに「削除済み」のステータスを持つ株式の一部で終了します。私はSaveChangesが "Stocks/ByStatus"インデックスに対して直接ではないので、IndexQueryのカットオフは適用されないと思います。

SaveChangesを同期化する方法や、NoSQL/RavenDBの考え方に合わせてこれを行う方法がありますか?

答えて

5

ドキュメントはすぐに保存されますが、パッチコマンドはまだ更新されていないインデックスで動作します。これはSaveChanges()とパッチ適用の間に挿入され、助け多分:ところで

using (var s = RavenContext.Store.OpenSession()) { 
    s 
     .Query<Stock>("Stocks/ByStatus") 
     .Customize(c => c.WaitForNonStaleResultsAsOfNow()) 
     .Take(0) 
     .ToArray(); 
} 

、あなたが店でそれらを直接呼び出すことができ、DatabaseCommandsのためのセッションを必要としません。

+0

これはうまくいくようです!私はこれがIndexQueryのためのカットオフを持つこととどのように違うのか分かりません。うまくいけば、パッチが実行される前に(Thread.Sleep(500)を入れてもまだ失敗しているので、あなたの解決策は良いと思う)、もっと時間がかかるからです。 –

関連する問題