7

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

由于这是不必要的,我们希望使用 NetName-property 作为 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")
                            }
                    });

价值没有改变

4

2 回答 2

6

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

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

现在重命名文档键没有一个很好的答案。确实应该有一个 DatabaseCommand 用于重新键入单个文档,并在修补时单独 PatchCommandType 重新键入。也许这将在未来被添加到 raven 中。

于 2013-01-03T15:49:54.283 回答
1

您可以在我的 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

于 2016-09-01T11:09:05.700 回答