RavenDB分片会导致更新充当插入

时间:2012-04-17 19:04:48

标签: c# ravendb sharding

我正在尝试使用RavenDB为我的工作场所设置一个简单的概念证明。该演示目前有2个分片正在执行基本的循环策略。然后它有2个以上的分片来复制这些分片中的每一个,作为故障转移。

我们经历并保存了各种商业记录。我们会得到Ids,例如matt-businesses-35,以及看起来正确的bob-business-42。但是,当我们编辑一个时,它不会更新现有记录,而是进行插入。大多数情况下,除了原版之外,我们最终会得到类似于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();
    }
}

我们是否设置了错误以解决这些奇怪的问题?这似乎是一个相当简单的设置,但更新总是插入一个新的密钥名称。

1 个答案:

答案 0 :(得分:3)

您的编辑操作错误。您需要先加载实体,然后将更改映射到已加载的实例,而不是再次使用已编辑的数据调用.Store()。当您调用.SaveChanges()时,RavenDBs会话会自动跟踪该实例上的更改并更新数据库中的文档。

在您的具体情况下,我不知道您在哪里调用.SaveChanges,但我想它在您的基本控制器上的OnActionExecuted或global.asax中的EndRequest内。无论哪种方式都有效。您所要做的就是通过id加载业务,更改其属性,然后就完成了。无需再次存储文档。

AutoMapper可以帮助您使用Map()方法的重载来更新实例,该方法采用预先实例化的对象。