RavenDB - 为什么,当按 ID 查询文档时,.加载<>返回值,查询<>不返回?



这是一个简单的类:

public class Person
{
    public int Id {get; set;}
    public string Name {get; set;}
}

当我将其保存在 RavenDB 中时,它会得到一些 Id 断言,比如说它是 1,然后这个

var person = session.Load<Person>("Person/1")

返回我指定的人,但这个

var person = session.Query<Person>().First(p => p.Id == 1)

错误并说"序列不包含任何元素"。我不知道为什么。

按文档的 ID 加载文档是一项 ACID 操作。 换句话说,在您保存文档的那一刻,它就可以进行检索。

另一方面,查询文档遵循"最终一致性"的 no-sql 概念。您正在查询一个索引,该索引可能有时间完全生成,也可能没有时间完全生成。

在您的示例中,索引仍然过时。 如果等待的时间足够长,查询将正确返回。 或者,您可以使用 WaitForNonStaleResults 自定义项告诉 Raven 等待,但这可能会产生危险的副作用 - 尤其是在繁忙的索引上。 可以在此处阅读有关过时索引查询的详细信息:http://ravendb.net/docs/client-api/querying/stale-indexes

通常,如果您知道文档的 ID,则应始终使用 .加载()。 使用 预订。Query() 用于实际需要索引查找的内容。 在您的情况下,合理的查询可能是:

var person = session.Query<Person>().Where(p => p.Name == "Joe").FirstOrDefault();

相关内容

最新更新