作为学习RavenDB的一部分,我试图根据我每晚下载的列表更新一组股票。
我有一个股票类,其中Id是股票代码:
public class Stock
{
public string Id { get; set; }
public StockStatus Status { get; set; }
}
我正在尝试使用此算法同步列表:
以下是实施:
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的思维方式?
答案 0 :(得分:5)
文档会立即存储,但补丁命令可以处理尚未更新的索引。也许这会有所帮助,插入SaveChanges()
和修补之间:
using (var s = RavenContext.Store.OpenSession()) {
s
.Query<Stock>("Stocks/ByStatus")
.Customize(c => c.WaitForNonStaleResultsAsOfNow())
.Take(0)
.ToArray();
}
顺便说一句,您不需要DatabaseCommands的会话,您可以直接在商店中调用它们。