我正在使用RavenDb嵌入式。作为我整合测试的一部分,我想检查对象是否持久化。当我在一个对象上SaveChanges然后检索它时,除非我处理我的连接,否则找不到它。
这对我不起作用,因为没有返回文件
using (var session = _dataDocumentStore.Instance.OpenSession())
{
session.Store(file);
session.SaveChanges();
}
...
using (var session = _dataDocumentStore.Instance.OpenSession() )
{
return session.Query<File>().ToList();
}
我创建了一个Flush方法来处理和重新创建一个可以工作的EmbeddableDocumentStore,但是因为这是感觉基本的东西我可能会以错误的方式处理事情:
public static IDocumentStore Initialize()
{
instance = new EmbeddableDocumentStore
{
DataDirectory = "App_Data/Database",
UseEmbeddedHttpServer = true,
};
instance.Initialize();
return instance;
}
public void Flush()
{
instance.Dispose();
Initialize();
}
你如何坚持RavenDB,然后检查它是否一直存在?对此的任何建议都很棒
答案 0 :(得分:15)
基本上,EmbeddableDocumentStore
需要更长的时间来保存和索引新数据,而不是保存和查询。
所以当你的测试说: -
负载比索引有时间完成更快地完成。
所以,就像Daniel Lang说的那样,你需要等待陈旧的结果。
但是你必须在你的代码中为你想要检查的每个查询做这件事。所以..让欺骗(合法):)
如果有人查询商店,请告诉您的文档商店始终等待陈旧的结果。
如何?
// Initialise the Store.
var documentStore = new EmbeddableDocumentStore
{
RunInMemory = true
};
documentStore.Initialize();
// Force query's to wait for index's to catch up. Unit Testing only :P
documentStore.RegisterListener(new NoStaleQueriesListener());
....
#region Nested type: NoStaleQueriesListener
public class NoStaleQueriesListener : IDocumentQueryListener
{
#region Implementation of IDocumentQueryListener
public void BeforeQueryExecuted(IDocumentQueryCustomization queryCustomization)
{
queryCustomization.WaitForNonStaleResults();
}
#endregion
}
#endregion
现在看看这个,请查看RavenOverflow @ github。并且该解决方案中的Tests project拥有您可能想要的所有爱情。)
答案 1 :(得分:12)
原因是,乌鸦指数过于陈旧,无法在此处返回。你需要这样做:
session.Query<File>()
.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
.ToList();
如需进一步阅读,请转到此处:http://ravendb.net/docs/client-api/querying/stale-indexes