В рамках изучения RavenDB я пытаюсь обновить коллекцию акций, основываясь на списке, который я загружаю ночью.
У меня есть класс Stock, где Id - это символ акции:
public class Stock
{
public string Id { get; set; }
public StockStatus Status { get; set; }
}
Я пытаюсь синхронизировать список с помощью этого алгоритма:
- Обновить или вставить все акции, загруженные сейчас как "StillActive".
- Любые акции со статусом "Активен""с прошлого раза означает, что они не были в обновлении и должны быть" удалены ".
- Все акции, все еще" 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, поэтому я получаю некоторое количество акций со статусом «Удалено», когда они должны быть активными.Я предполагаю, что отсечение IndexQuery не применяется, так как SaveChanges не имеет прямого отношения к индексу «Stocks / ByStatus».
Есть ли способ сделать SaveChanges синхронным или каким-либо другим способом, который больше подходит дляобраз мышления NoSQL / RavenDB?