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

本文关键字:更新 插入 RavenDB | 更新日期: 2023-09-27 18:31:21

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

我们浏览并保存了各种业务记录。 我们会得到 Id,例如 matt-business-35 和看起来正确的 bob-business-42。 但是,当我们编辑一个记录时,它不会更新现有记录,而是进行插入。 大多数情况下,除了原始的 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();
    }
}

我们是否设置错误来获得这些奇怪的问题? 这似乎是一个相当简单的设置,但更新总是使用新的键名称插入。

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

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

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

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