5

这是一个简单的类:

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)

出错并说“序列不包含任何元素”。我不明白为什么。

4

1 回答 1

11

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

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

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

通常,如果您知道文档的 Id,则应始终使用 .Load()。使用 .Query() 保留实际需要索引查找的内容。在您的情况下,一个合理的查询可能是:

var person = session.Query<Person>().Where(p => p.Name == "Joe").FirstOrDefault();
于 2012-08-08T15:14:02.593 回答