在RavenDB中更改Id的值

Seb*_*ack 6 unique-constraint ravendb

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

由于这是不必要的,我们希望将NetName属性用作Id.因此,我们不需要UniqueConstraints来知道它是唯一的,并且当我们拥有NetName时能够使用Load也能获得好处.

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

"organizations/"+ CleanupId(this.NetName)
Run Code Online (Sandbox Code Playgroud)

所以我们现在准备好将该值移动到我们的Id.但我们无法让它发挥作用.我们的问题是,在下面的PatchRequest中,我们最终得到了一个名为Id的新属性,但是acctual Id仍然具有相同的值(见截图).是否有更好(正确)的方法来更改Id的值?

实体:

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

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

   public string TempUniqueNetName{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们想做这样的事情:

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

价值没有改变

Mat*_*int 6

我不认为您可以通过修补来更改文档密钥.它实际上并不存储在文档或元数据中 - 它会在加载时复制到@id元数据中,以使您产生错觉,并且Raven Client会将其再次复制到文档中您自己的标识属性中.但实际上,它是底层的esent文档存储中的一个单独值.Raven必须具体知道如何处理这个并为你伪造它.

您可以手动将文档从旧ID复制到新ID并删除旧文件,但这可能非常耗时.

现在重命名文档密钥没有很好的答案.确实应该有一个DatabaseCommand用于重新键入单个文档,并在修补时将PatchCommandType分离为重新键入.也许这将在未来添加到乌鸦.

  • 仅供参考:RavenDB开发人员回复说他们不会添加此功能,而是"它可以被用户实现为一对事务性的删除/放置对." (2认同)