我們似乎已經證實,即使我們使用各種風格的「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