RavenDB:异步SaveChanges影响以后的更新?

时间:2011-08-13 03:57:33

标签: c# nosql ravendb

作为学习RavenDB的一部分,我试图根据我每晚下载的列表更新一组股票。

我有一个股票类,其中Id是股票代码:

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

我正在尝试使用此算法同步列表:

  1. 将现在下载的所有股票更新或插入为“StillActive”。
  2. 上次状态为“有效”的股票意味着他们不在更新中,需要“删除”。
  3. 所有股票仍然“StillActive”成为新的“活跃”股票。
  4. 以下是实施:

    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是一个扩展方法,它使用现在的Cutoff执行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启动时没有完成,所以当它们应该是“活动”时,我最终会得到一些状态为“已删除”的股票。我想IndexQuery截止值不适用,因为SaveChanges不直接反对“Stocks / ByStatus”索引。

    有没有办法让SaveChanges同步或以其他方式做到这一点,更符合NoSQL / RavenDB的思维方式?

1 个答案:

答案 0 :(得分:5)

文档会立即存储,但补丁命令可以处理尚未更新的索引。也许这会有所帮助,插入SaveChanges()和修补之间:

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

顺便说一句,您不需要DatabaseCommands的会话,您可以直接在商店中调用它们。