这是一个简单的类:
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)
出错并说'序列不包含任何元素'。我不明白为什么。
答案 0 :(得分:11)
根据ID加载文档是ACID operation。换句话说,在您保存文档的那一刻,它可供检索。
另一方面,查询文档遵循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();