商店后直接查询的文档

时间:2014-04-23 17:11:21

标签: store ravendb

我试图存储"角色"对象然后获取角色列表,如下所示:

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;调用

2 个答案:

答案 0 :(得分:4)

您正在将RavenDB视为关系数据库,并且它不是。加载和存储是RavenDB中的ACID操作,查询不是。索引(查询所必需的)是异步更新的,实际上,当您在没有指定持久索引的情况下执行session.Query<T>()时,可能必须从头开始构建临时索引。因此,如果您正在尝试查询您刚刚存储的信息,或者如果您正在执行需要创建临时索引的FIRST查询,那么您可能无法获得所需的数据。

customizing your query to wait for non-stale results的方法,但你不应该依赖这些太多,因为它们表明设计不好 - 最好弄明白更好的方式以一种包含最终一致性的方式做同样的事情,要么改变你的模型(所以你通过加载/存储获得一致性 - 也许你可以有一个文档定义列表中的所有角色?)或通过更改应用程序流程,因此您不需要存储,然后立即查询。

答案 1 :(得分:0)

解决此问题的另一种方法是在save函数内打开WaitForNonStaleResultsAsOfLastWrite()来查询索引。这样,当保存完成时,索引将更新为至少包括您刚才所做的更改。

您可以阅读有关此here

的更多信息