2

RavenDB 遇到了一个奇怪的问题

public ActionResult Save(RandomModel model)
{
//Do some stuff, validate model etc..

RavenSession.Store(model);
RavenSession.SaveChanges();


var newListOfModels = RavenSession.Query<RandomModel>().ToList();
return View("randomview",newListOfModels);
}

newListOfModels 不包含我刚刚使用 store 方法添加的模型。

但是,如果我在 savechanges 之后添加一个 Thread.Sleep(100) ,则存储的模型将包含在新列表中。

我是否以错误的方式将内容存储和保存到 RavenDB?

我应该怎么做?

当然,可以通过将传入模型添加到 newListOfModels 并在例如 basecontrollers onactionexecuted 方法之后运行 SaveChanges 来解决问题。

我主要关心的是为什么我需要延迟线程,然后才能查询文档会话并在那里找到我新添加的模型。

4

1 回答 1

6

RavenDB 索引本质上是陈旧的。从文档中

RavenDB 在后台线程中执行数据索引,每当有新数据进入或现有数据更新时执行。将此作为后台线程运行允许服务器快速响应,即使大量数据已更改,但在这种情况下,您可能会查询过时的索引。

所以你需要在查询时告诉 RavenDB 等待索引被重新定义。

您可以进行各种WaitFor...自定义,您很可能需要以下WaitForNonStaleResultsAsOfLastWrite选项:

var newListOfModels = RavenSession
    .Query<RandomModel>()
    .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()).ToList();
于 2012-11-05T19:55:05.490 回答