使用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的东西吗?
我该怎么做?
当然,只需将传入模型添加到newListOfModel并运行SaveChanges,例如在basecontrollers onactionexecuted方法中,就可以解决这个问题。
我主要担心的是为什么我需要延迟线程才能查询documentsession并在那里找到我新添加的模型。
答案 0 :(得分:6)
RavenDB索引本质上是陈旧的。 From the documentation:
RavenDB在后台线程中执行数据索引,即 每当有新数据进入或现有数据更新时执行。 将此作为后台线程运行允许服务器响应 即使大量数据发生了变化,也很快就会发生变化 你可以查询陈旧的索引。
因此,在查询等待索引被重写时,需要告诉RavenDB。
您可以使用各种WaitFor...
自定义,您很可能需要WaitForNonStaleResultsAsOfLastWrite
选项:
var newListOfModels = RavenSession
.Query<RandomModel>()
.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()).ToList();