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

リッチ クライアント アプリを実行していて、次のように完全なBlogPostをクライアントにシリアル化する場合:

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

次に、ユーザーが変更を加えた後、サーバー上で完全なBlogPostをリハイドレートします。以下のコードは、Load を実行してから Store を実行するよりも効率的です。

//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 に送信します。

これは、すべてのデータが既にある場合に Load と Store を実行すると、Raven へのネットワーク トラフィックが 2 倍になり、Fiddler を使用して確認できる追加の利点がないことを意味します。

オブジェクトの一部 (BlogPost の名前など) のみを変更した場合でも、RavenDB .NET API は次のことを行うと、ネットワーク経由で完全なオブジェクトを送信します。

  • ロード()
  • いくつかの変更を加えます (ただし、すべてを変更するわけではありません)
  • 店()
  • 変更内容を保存()

おそらく、Ayende Rahien は、私がここで見逃したことについて教えてくれるでしょうか?

于 2013-03-28T19:36:31.297 に答える
5

ジェイソン、あなたのコードは常にドキュメントを上書きします。それはあなたがしたいことですか?

于 2013-03-28T09:00:50.353 に答える
1

Store は、このオブジェクトを新しいドキュメントに保存します。ドキュメントが示唆するように、Unit of Work パターンとも呼ばれるセッション オブジェクトに組み込まれている変更追跡機能を使用します。

于 2013-03-27T23:27:19.847 に答える