我们似乎已经证实,即使我们使用各种风格的“WaitForNonStaleResults”,RavenDB也会得到过时的结果。以下是全功能示例代码(作为独立测试编写,以便您可以复制/粘贴并按原样运行)。RavenDB在删除后返回陈旧结果
public class Cart
{
public virtual string Email { get; set; }
}
[Test]
public void StandaloneTestForPostingOnStackOverflow()
{
var testDocument = new Cart { Email = "[email protected]" };
var documentStore = new EmbeddableDocumentStore { RunInMemory = true };
documentStore.Initialize();
using (var session = documentStore.OpenSession())
{
using (var transaction = new TransactionScope())
{
session.Store(testDocument);
session.SaveChanges();
transaction.Complete();
}
using (var transaction = new TransactionScope())
{
var documentToDelete = session
.Query<Cart>()
.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
.First(c => c.Email == testDocument.Email);
session.Delete(documentToDelete);
session.SaveChanges();
transaction.Complete();
}
RavenQueryStatistics statistics;
var actualCount = session
.Query<Cart>()
.Statistics(out statistics)
.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
.Count(c => c.Email == testDocument.Email);
Assert.IsFalse(statistics.IsStale);
Assert.AreEqual(0, actualCount);
}
}
我们试图WaitForNonStaleResults的每一种滋味并没有改变。等待非陈旧的结果似乎适用于更新,但不适用于删除。
更新
,我尝试过的一些事情:
使用每个动作单独的会话。结果:没有区别。同样的成功和失败。
在最终查询之前放置
Thread.Current.Sleep(500)
。结果:成功。如果我睡了半秒钟,计数就会回到零。
testDocument声明在哪里?你确定documentToDelete不是null吗?是否有可能需要关闭会话并用新会话进行查询? – 2012-03-03 00:49:33
testDocument在函数的第一行中初始化。至于新的会话,我不应该打开一个新的会话来获取当前的查询结果,但无论如何我已经尝试过了。我将编辑帖子以包含其他信息观察。 – 2012-03-03 12:16:47
有趣的是,睡了半秒的作品。我能想到的唯一的另一件事是它是一个错误,或者你需要一个更好的索引。你使用的是什么版本的RavenDB? – 2012-03-03 13:34:06