这是一个简单的类:
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();