在RavenDB中更新现有文档时调用_documentSession.Store有什么缺点吗?

在RavenDB中更新现有文档时调用_documentSession.Store有什么缺点吗?,ravendb,Ravendb,在RavenDB中创建新文档或更新现有文档时,文档中说要按照以下思路进行操作: public string Save(Blogpost post) { Blogpost model; if (String.IsNullOrEmpty(post.Id)) { model = new Blogpost(); _documentSession.Store(model); } else { model =

在RavenDB中创建新文档或更新现有文档时,文档中说要按照以下思路进行操作:

public string Save(Blogpost post)
{
    Blogpost model;

    if (String.IsNullOrEmpty(post.Id))
    {
        model = new Blogpost();
        _documentSession.Store(model);
    }
    else
    {
        model = _documentSession.Load<Blogpost>(post.SimpleId);
    }

    model.Text = template.Text;
    model.Name = template.Name;
    _documentSession.SaveChanges();

    return model.Id;
}

即使文档已经存在,始终调用
.Store()
是否有任何缺点?

存储将在新文档中存储此对象。使用会话对象(也称为工作单元模式)中内置的更改跟踪功能,如文档建议的那样。

Jason,
您的代码将始终覆盖文档。这是您想要做的吗?

如果您正在做一个富客户端应用程序,并将完整的博客帖子序列化到客户端,如下所示:

//GET BlogPost/1
public BlogPost Get(int id)
{
    return _documentSession.Load<BlogPost>(id)
}
当你做一个

documentSession.Load<Blogpost>(id)
documentSession.Load(id)
RavenDB返回您已经拥有的博客文章的完整JSON,以便您覆盖它,然后重新保存,将博客文章的完整JSON通过线路再次发送回Raven

这意味着,在您已经拥有所有数据的情况下进行加载和存储,会使Raven的网络流量增加两倍,而我在使用Fiddler时看不到任何额外的好处

即使您只是更改了对象的一部分(比如BlogPost的名称),RavenDB.NET API在执行以下操作时仍然会通过网络发送完整的对象:

  • 加载()
  • 进行一些更改(但不是全部更改)
  • 存储()
  • SaveChanges()

也许Ayende Rahien可以告诉我们我在这里遗漏了什么?

在大约1/2的用例中,完全覆盖是可以的。我质疑他提出的这种方法,因为我已经习惯了实体框架和典型的工作单元。我只是想确保这种方法不会在我们的应用程序中引起任何潜在问题。覆盖的一个不太明显的副作用是自定义元数据值将丢失。是的,如果要保留元数据,请加载文档,更新它,然后调用SaveChanges(),我同意这一点。有人想出了这个主意,我不想在不理解原因的情况下随意地把它击倒。它的优点是它确实使代码在某些方面更加干净。synhershko有没有什么我不知道的原因?在我的在线测试中,它似乎对原始流量没有任何影响…@JohnCulviner查看我对你帖子的评论。这变成了一个讨论,应该在邮件列表上讨论,而不是在邮件列表上讨论。您缺少3件事:1)RavenDB客户端API使用缓存,因此如果您已经在Get中加载了它,那么在Post中再次加载它将生成最小流量,而不是完整的JSON文档。如果您得到了完整的JSON文档,那么再次加载它就很好了,因为在处理它的过程中还有其他更改。2) 作为#1的继续,它使您能够利用乐观并发性,3)UoW是做这类事情的正确方法,主要是因为我刚才提到的原因。太棒了,这就是我们所寻找的答案。我不知道我是否在无线通信中看到了#1,但可能是因为进行了调试。我认为乐观并发是一个很好的观点。我想可以使用Automapper将博客文章从客户机推送到Load'ed中,或者这有关系吗?好东西!也许我/你也可以在这方面更新文档页面。
//POST BlogPost/
public void Post(BlogPost post)
{
    //blog post already has an Id in this example
    _documentSession.Store(post)
    _documentSession.SaveChanges(); 
}
documentSession.Load<Blogpost>(id)