5

在 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()即使文档已经存在,总是调用有什么缺点吗?

4

3 回答 3

5

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

于 2013-03-28T09:00:50.353 回答
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。

这意味着当您已经拥有所有数据时执行加载和存储会导致 Raven 的网络流量增加一倍,而我使用 Fiddler 并没有看到额外的好处。

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

  • 加载()
  • 进行一些更改(但不是对所有内容进行更改)
  • 店铺()
  • 保存更改()

也许 Ayende Rahien 可以启发我们了解我在这里错过的任何事情?

于 2013-03-28T19:36:31.297 回答
1

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

于 2013-03-27T23:27:19.847 回答