【发布时间】:2011-08-13 13:33:07
【问题描述】:
作为学习 RavenDB 的一部分,我正在尝试根据我每晚下载的列表更新一组股票。
我有一个 Stock 类,其中 Id 是股票代码:
public class Stock
{
public string Id { get; set; }
public StockStatus Status { get; set; }
}
我正在尝试使用此算法同步列表:
- 更新或插入所有现在下载为“StillActive”的股票。
- 任何上次状态为“有效”的股票都表示它们不在更新中,需要“删除”。
- 所有仍为“StillActive”的股票成为新的“Active”股票。
这里是实现:
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 开始时还没有完成,所以当它们应该是“活动”时,我最终会得到一些状态为“已删除”的股票。我猜 IndexQuery 截止值不适用,因为 SaveChanges 不直接针对“Stocks/ByStatus”索引。
有没有一种方法可以使 SaveChanges 同步或其他更符合 NoSQL/RavenDB 思维方式的方法?
【问题讨论】: