gpt4 book ai didi

c# - 为什么 Raven 会为我的新文档生成一个已经存在的文档 ID?

转载 作者:行者123 更新时间:2023-11-30 13:46:01 24 4
gpt4 key购买 nike

为什么这段代码(试图)用第二个对象覆盖我的第一个对象?我的第一个对象特别有一个 Id 为“StringBasedIdClasses/1”,而第二个对象没有提供 Id,所以 Raven 应该生成一个未使用的 Id,不是吗?

 var quickStore = new EmbeddableDocumentStore() { RunInMemory = true };
quickStore.Initialize();
quickStore.RegisterListener(new DocumentConversionListener()).RegisterListener(new DocumentStoreListener());

using (var session = quickStore.OpenSession())
{
session.Advanced.UseOptimisticConcurrency = true;
var stringIdTest = new StringBasedIdClass()
{
Id = "StringBasedIdClasses/1",
Name = "StringItem1"
};

session.Store(stringIdTest);
session.SaveChanges();
}

using (var session = quickStore.OpenSession())
{
session.Advanced.UseOptimisticConcurrency = true;
var stringIdTest = new StringBasedIdClass()
{
Name = "DidIReplaceYou"
};

session.Store(stringIdTest);
session.SaveChanges();//This fails with a ConcurrencyViolation as I use OptimisticConcurrency and have Etag support on my objects
}

一切都在使用文档存储的一个当前实例。这看起来很基础,所以一定是漏掉了一些简单的东西。

最佳答案

好的,部分答案是 Thomas 所说的,但更具体地说,RavenDb 完全忽略您手动插入的 ID。为了进行批量导入(比如像我正在做的那样将数据从旧系统迁移到新系统,您需要执行以下操作:

  1. 确保处理连接到该数据库的所有文档存储(通常这意味着,不要让您的应用程序运行
  2. 批量导入系统,自己设置 id(您有责任确保不覆盖任何现有记录,但您可以为此使用乐观并发和 etags)
  3. 在导入结束时,使用以下代码将集合的 hilo(基本上是新 ID 的起点)设置为高于系统中当前最高 ID 的值:

    session.Store(new {Id = "Raven/Hilo/{yourcollectionname}", Max = newMaxValue});
    session.SaveChanges();
  4. 现在当您初始化新商店时,将使用正确的 hilo 值。

请注意,此过程无法使用 EmbeddableDocumentStore 的内存版本来模拟,因为您每次打开商店时都会创建一个全新的服务器实例。因此,如果您尝试假设现有/非现有记录的已知 ID 进行集成测试,则必须让 Raven 选择 ID,而不是将它们设置在您自己的对象中。这应该可以正常工作,因为您的新内存存储总是从 1 开始。为了确保测试的隔离,我为每个测试都开了一个新商店。

关于c# - 为什么 Raven 会为我的新文档生成一个已经存在的文档 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23936312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com