1

RavenDB を使用して職場の簡単な概念実証をセットアップしようとしています。デモには、現在、基本的なラウンド ロビン戦略を実行する 2 つのシャードがあります。次に、フェイルオーバーとして、それらの 2 つのそれぞれを複製するための 2 つのシャードがあります。

さまざまなビジネス記録を調べて保存しました。Matt-businesses-35 や bob-businesses-42 など、適切に見える ID を取得します。ただし、1 つを編集すると、既存のレコードは更新されず、挿入が行われます。そしてほとんどの場合、元の ID に加えて、matt-bob-business-42 のような ID になります。

このページをガイドとしてたどりました: http://msdn.microsoft.com/en-us/magazine/hh547101.aspx

ただし、DataDocumentstore.cs のコードを置き換えることで、シャーディング用に変更しました。

var shards = new Dictionary<string, IDocumentStore>
                 {
                     {"bob", new DocumentStore() {Url = "http://bob:8080"}},
                     {"matt", new DocumentStore() {Url = "http://matt:8080"}},
                 };

var shardStrategy = new ShardStrategy(shards);

instance = new ShardedDocumentStore(shardStrategy);
instance.Conventions.IdentityPartsSeparator = "-";
instance.Initialize();

編集アクションは次のようになります。

public ActionResult Edit(string id)
{
    var model = DocumentSession.Load<Business>(id);
    return View(model);
}

[HttpPost]
public ActionResult Edit(string id, Business business)
{
    try
    {
        if (ModelState.IsValid)
        {
            DocumentSession.Store(business);
            return RedirectToAction("Index");
        }
        return View(business);
    }
    catch
    {
        return View();
    }
}

これらの奇妙な問題を発生させるために、何か間違った設定をしましたか? かなり単純なセットアップのように見えますが、更新は常に新しいキー名で挿入されます。

4

1 に答える 1

3

あなたの編集アクションは間違っています。.Store()編集したデータでもう一度呼び出す代わりに、最初にエンティティをロードしてから、ロードしたインスタンスに変更をマップする必要があります。RavenDBs セッションは、そのインスタンスの変更を自動的に追跡し、 を呼び出すとデータベース内のドキュメントを更新します.SaveChanges()

あなたの特定のケースでは、.SaveChanges をどこで呼び出すかわかりませんが、ベース コントローラーの OnActionExecuted または global.asax の EndRequest 内にあると思います。どちらの方法でも機能します。あなたがしなければならないことは、id によってビジネスをロードし、そのプロパティを変更することだけです。書類を再度保管する必要はありません。

AutoMapper は、事前にインスタンス化されたオブジェクトを受け取る Map() メソッドのオーバーロードを使用してインスタンスを更新するのに役立ちます。

于 2012-04-17T21:05:54.393 に答える