在RavenDB中更改Id的值

时间:2013-01-03 13:12:58

标签: ravendb unique-constraint

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

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

我们需要先清理一下我们的netname,然后再将其用作Id,这样我们就创建了一个名为TempUniqueNetName的新临时属性,该属性现在保存的值为:

"organizations/"+ CleanupId(this.NetName)

所以我们现在准备好将这个值移动到我们的Id。但我们无法让它发挥作用。我们的问题是,在下面的PatchRequest中,我们最终得到了一个名为Id的新属性,但是acctual 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")
                            }
                    });

Value has not changed

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

您可以检查PUT-DELETE用法的实现,以更新我的github仓库中的ID。 看起来应该是这样的:

A <- matrix(c(1:4, 2,5:7, 3,6,8:9, 4,7,9,10), 4,4)
A[1, -c(1,1)]

spec.mult1 <- function(A,B) {
  rA <- nrow(A); cB <- ncol(B)
  C <- A %*% B
  for (i in 1:rA) for (j in 1:cB) 
    C[i,j] <- C[i,j] - A[i,i]*B[i,j] - A[i,j]*B[j,j] + ifelse(i==j, A[i,i]*B[j,j], 0) 
  C
}

spec.mult2 <- function(A) {
  dA.A <- diag(A)*A
  crossprod(A) - dA.A - t(dA.A) + diag(diag(A)^2)
}

spec.mult3 <- function(A,B) {
  rA <- nrow(A); cB <- ncol(B)
  C <- A %*% B
  for (i in 1:rA) for (j in 1:cB) 
    C[i,j] <- C[i,j] - A[i,i]*B[i,j] - A[i,j]*B[j,j] 
  for (i in 1:rA) C[i,i] <- C[i,i] + A[i,i]*B[i,i]
  C
}

spec.mult4 <- function(A) {
  dA <- diag(A)
  dA.A <- dA*A
  crossprod(A) - dA.A - t(dA.A) + diag(dA^2)
}

spec.mult5 <- function(sig.adj) {
  nr <- nrow(sig.adj); nc <- ncol(sig.adj)
  C <- matrix(NA, nr, nc)
  for (i in 1:nr) for (j in 1:nc) 
    C[i,j] <- sum(sig.adj[i, -c(i, j)]*sig.adj[-c(i, j), j])
  C
}

spec.mult1(A, A) - spec.mult5(A) 
spec.mult2(A) - spec.mult5(A)
spec.mult3(A, A) - spec.mult5(A) 
spec.mult4(A) - spec.mult5(A)

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

这里还有一些Raven文档:

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