【问题标题】:Changing the value of an Id in RavenDB在 RavenDB 中更改 Id 的值
【发布时间】:2013-01-03 13:12:58
【问题描述】:

我们有一个名为 Organization 的实体,我们在该实体上使用 UniqueConstraints-bundle。我们有一个名为 NetName 的属性,它是一个 UniqueConstraint 和一个自动生成的 Id。

由于这是不必要的,我们希望使用 NetName 属性作为 Id。这样我们就不需要 UniqueConstraints 来知道它是唯一的,并且还可以在我们拥有 NetName 时从能够使用 Load 中受益。

在将网络名用作 Id 之前,我们需要稍微清理一下网络名,因此我们创建了一个名为 TempUniqueNetName 的新临时属性,该属性现在包含以下值:

"organizations/"+ CleanupId(this.NetName)

所以我们现在准备简单地将该值移动到我们的 Id 中。但我们无法让它工作。我们的问题是,使用下面的 PatchRequest,我们最终在数据库中得到了一个名为 Id 的新属性,但实际的 Id 仍然具有相同的值(见屏幕截图)。是否有更好(正确)的方法来更改 Id 的值?

实体:

class Organization {
   public string Id { get; set; }

   [UniqueConstraint]
   public string NetName { get; set; }

   public string TempUniqueNetName{ get; set; }
}

我们想做这样的事情:

_documentStore.DatabaseCommands.UpdateByIndex(typeof(Organizations).Name,
            new IndexQuery(),
            new[]
                    {
                        new PatchRequest()
                            {
                                Type = PatchCommandType.Rename,
                                Name = "TempUniqueNetName",
                                Value = new RavenJValue("Id")
                            }
                    });

【问题讨论】:

    标签: ravendb unique-constraint


    【解决方案1】:

    我认为您不能通过修补来更改文档密钥。它实际上并没有与文档或元数据一起存储 - 它在加载时被复制到 @id 元数据中,让您产生它在那里的错觉,并且 Raven 客户端将它再次复制到文档中您自己的身份属性中。但实际上,它是底层 esent 文档存储中的一个单独值。 Raven 必须具体知道如何处理并为您伪造它。

    您可以手动将文档从旧 id 复制到新 id 并删除旧的,但这可能很耗时。

    目前对于重命名文档密钥没有很好的解决方案。确实应该有一个 DatabaseCommand 用于重新键入单个文档,并单独 PatchCommandType 以在修补时重新键入。也许这会在未来被添加到 raven 中。

    【讨论】:

    • 好的,谢谢你的回答。我们可能会使用您的建议并复制文档。这是一次性的事情,所以我没关系,这需要一段时间。希望下次我们需要它时可以实现它:)
    • 仅供参考:RavenDB 开发人员回应说他们不会添加此功能,而是“它可以很容易地由用户实现为一对删除/放置的事务。”
    【解决方案2】:

    您可以在我的 github 存储库中检查 PUT-DELETE 用于更新 ID 的实现。 它应该看起来像这样:

    store.DatabaseCommands.Put(updatedKey, null, document.DataAsJson, newMetadata);
    store.DatabaseCommands.Delete(oldKey, null);
    

    https://github.com/Sevsoad/SagaUpdater/

    这里还有一些 Raven 文档:

    https://ravendb.net/docs/article-page/3.0/csharp/client-api/commands/documents/put

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      相关资源
      最近更新 更多