我们正在升级到RavenDB 2.5,但遇到了一个奇怪的情况。我们的一个单元测试突然失败了,但没有明显的原因。
以下是一些简单的代码来重现这个问题:
这些查询的输出如下所示:
以下是一些简单的代码来重现这个问题:
class Foo
{
public Guid Id { get; private set; }
public DateTime? ExpirationTime { get; set; }
public Foo()
{
Id = Guid.NewGuid();
ExpirationTime = null;
}
}
var documentStore = new EmbeddableDocumentStore
{
RunInMemory = true,
Conventions = { DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites }
};
documentStore.Initialize();
using (var session = documentStore.OpenSession())
{
session.Store(new Foo());
session.Store(new Foo());
session.SaveChanges();
}
现在,数据库中有两个带有 ExpirationTime = null 的文档。当查询这些文档时会发生以下情况:
using (var session = documentStore.OpenSession())
{
var bar = session.Query<Foo>().Where(foo => foo.ExpirationTime == null).ToList();
Console.WriteLine("1. Number of documents: {0}", bar.Count);
bar = session.Query<Foo>().Where(foo => foo.ExpirationTime == null ||
foo.ExpirationTime > DateTime.Now).ToList();
Console.WriteLine("2. Number of documents: {0}", bar.Count);
bar = session.Query<Foo>().Where(foo => foo.ExpirationTime == null |
foo.ExpirationTime > DateTime.Now).ToList();
Console.WriteLine("3. Number of documents: {0}", bar.Count);
}
这些查询的输出如下所示:
1. Number of documents: 2
2. Number of documents: 0
3. Number of documents: 2
我认为这不正确... 我还期望第二个数字是2。
我在RavenDB服务器上运行了相同的查询,并获得了预期的结果,因此看起来这是EmbeddableDocumentStore的问题。
在测试过程中,我还发现在其他情况下使用逻辑或运算符时会出现一些奇怪的行为。有时使用foo.HasValue
会给出与foo != null
不同的结果,但这可能与同一问题有关。
还有其他人遇到这个问题吗?已知的错误吗?
DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites
或WaitForNonStaleResultsAsOfLastWrite()
。在升级到Raven 2.5之前,这也按预期工作。 - Nils Magne Lunde