我试图存储"角色"对象然后获取角色列表,如下所示:
public class Role
{
public Guid RoleId { get; set; }
public string RoleName { get; set; }
public string RoleDescription { get; set; }
}
//Function store:
private void StoreRole(Role role)
{
using (var docSession = docStore.OpenSession())
{
docSession.Store(role);
docSession.SaveChanges();
}
}
// then it return and a function calls this
public List<Role> GetRoles()
{
using (var docSession = docStore.OpenSession())
{
var Roles = from roles in docSession.Query<Role>() select roles;
return Roles.ToList();
}
}
但是,在GetRoles中,我错过了最后插入的记录/文档。如果我等待200ms然后调用此函数,则该项目就在那里。
所以我没有同步。 ?!
我该如何解决这个问题,或者我怎么知道结果何时在文档存储中进行查询?
我已经使用了交易,但无法解决这个问题。更新和删除都很好,但插入时我需要延迟我的列表&#39;调用
答案 0 :(得分:4)
您正在将RavenDB视为关系数据库,并且它不是。加载和存储是RavenDB中的ACID操作,查询不是。索引(查询所必需的)是异步更新的,实际上,当您在没有指定持久索引的情况下执行session.Query<T>()
时,可能必须从头开始构建临时索引。因此,如果您正在尝试查询您刚刚存储的信息,或者如果您正在执行需要创建临时索引的FIRST查询,那么您可能无法获得所需的数据。
有customizing your query to wait for non-stale results的方法,但你不应该依赖这些太多,因为它们表明设计不好 - 最好弄明白更好的方式以一种包含最终一致性的方式做同样的事情,要么改变你的模型(所以你通过加载/存储获得一致性 - 也许你可以有一个文档定义列表中的所有角色?)或通过更改应用程序流程,因此您不需要存储,然后立即查询。
答案 1 :(得分:0)
解决此问题的另一种方法是在save函数内打开WaitForNonStaleResultsAsOfLastWrite()来查询索引。这样,当保存完成时,索引将更新为至少包括您刚才所做的更改。
您可以阅读有关此here
的更多信息