RavenDB: асинхронные изменения SaveChanges, влияющие на последующие обновления? - PullRequest
0 голосов
/ 13 августа 2011

В рамках изучения RavenDB я пытаюсь обновить коллекцию акций, основываясь на списке, который я загружаю ночью.

У меня есть класс Stock, где Id - это символ акции:

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

Я пытаюсь синхронизировать список с помощью этого алгоритма:

  1. Обновить или вставить все акции, загруженные сейчас как "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, поэтому я получаю некоторое количество акций со статусом «Удалено», когда они должны быть активными.Я предполагаю, что отсечение IndexQuery не применяется, так как SaveChanges не имеет прямого отношения к индексу «Stocks / ByStatus».

Есть ли способ сделать SaveChanges синхронным или каким-либо другим способом, который больше подходит дляобраз мышления NoSQL / RavenDB?

1 Ответ

5 голосов
/ 13 августа 2011

Документы сохраняются сразу, но команды исправления работают с индексом, который еще не обновлен. Может быть, это поможет, вставленный между SaveChanges() и патчем:

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

Кстати, вам не нужен сеанс для DatabaseCommands, вы можете вызвать их прямо в магазине.

...