在RavenDB中更新现有文档时调用_documentSession.Store有什么不利之处?

时间:2013-03-27 21:21:58

标签: ravendb

在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;
}

我的团队中有人正在以另一种方式为创建新文档或更新现有文档进行保存:

public string Save(Blogpost post)
{
    _documentSession.Store(post);
    _documentSession.SaveChanges();
    return post.Id;
}

即使文档已经存在,总是调用.Store()是否有任何不利之处?

3 个答案:

答案 0 :(得分:5)

如果您正在使用富客户端应用并将完整的 BlogPost 序列化到客户端,请执行以下操作:

//GET BlogPost/1
public BlogPost Get(int id)
{
    return _documentSession.Load<BlogPost>(id)
}

然后在用户进行更改后,在服务器上重新编写完整的 BlogPost 。以下代码似乎比执行加载然后存储更有效:

//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)

RavenDB返回您已经拥有的博客文章的完整JSON,只是为了覆盖它,转身并重新保存,通过网络重新发送博客帖子的完整JSON乌鸦。

这意味着当您已经拥有所有数据时进行加载和存储会导致Raven的网络流量增加一倍,而使用Fiddler无法获得额外的好处。

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

  • 负载()
  • 进行一些更改(但不更改所有内容)
  • 存储()
  • 的SaveChanges()

也许Ayende Rahien可以在我错过的任何事情上启发我们吗?

答案 1 :(得分:4)

杰森, 您的代码将始终覆盖文档。那是你想做的事吗?

答案 2 :(得分:1)

Store会将此对象存储在新文档中。使用会话对象中内置的更改跟踪功能,即工作单元模式,与文档建议一样。