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

Jas*_*ore 5 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;
}
Run Code Online (Sandbox Code Playgroud)

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

public string Save(Blogpost post)
{
    _documentSession.Store(post);
    _documentSession.SaveChanges();
    return post.Id;
}
Run Code Online (Sandbox Code Playgroud)

.Store()即使文件已经存在,总是打电话有什么不利吗?

Aye*_*ien 5

Jason,你的代码总是会覆盖文档。这是你想做的事吗?

  • 在大约 1/2 的用例中,完全覆盖就可以了。我质疑他提出的这种方法,因为我习惯了实体框架和典型的工作单元。我只是想确保这种方法不会在我们的应用程序中引起潜在的问题。 (2认同)

Joh*_*ner 5

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

//GET BlogPost/1
public BlogPost Get(int id)
{
    return _documentSession.Load<BlogPost>(id)
}
Run Code Online (Sandbox Code Playgroud)

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

//POST BlogPost/
public void Post(BlogPost post)
{
    //blog post already has an Id in this example
    _documentSession.Store(post)
    _documentSession.SaveChanges(); 
}
Run Code Online (Sandbox Code Playgroud)

当你这样做的时候

documentSession.Load<Blogpost>(id)
Run Code Online (Sandbox Code Playgroud)

RavenDB为您已经拥有的博客帖子返回完整的JSON,以便覆盖它,转过身并重新保存,通过网络向Raven发送完整的博客文章JSON.

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

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

  • 加载()
  • 一些改变(但不是改变一切)
  • 商店()
  • 保存更改()

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


syn*_*hko 1

Store 会将该对象存储在一个新文档中。使用会话对象中内置的更改跟踪功能,也称为工作单元模式,就像文档建议的那样。