2013-01-03 11 views
5

Wir haben eine Entität namens Organisation, für die wir das UniqueConstraints-Bundle verwenden. Wir haben eine Eigenschaft namens NetName, die eine UniqueConstraint und eine automatisch generierte ID ist.Den Wert einer ID in RavenDB ändern

Da dies nicht notwendig ist, möchten wir stattdessen die NetName-Eigenschaft als Id verwenden. Damit wir UniqueConstraints nicht benötigen, um zu wissen, dass es einzigartig ist, und auch den Nutzen daraus ziehen können, Load zu verwenden, wenn wir den NetName haben.

Wir brauchten unsere netname ein wenig aufzuräumen, bevor sie als eine Kennung, so haben wir eine neue temporäre-Eigenschaft namens TempUniqueNetName, die jetzt hält den Wert der Verwendung:

"organizations/"+ CleanupId(this.NetName) 

So sind wir nun bereit, einfach verschiebe diesen Wert auf unsere ID. Aber wir können es nicht zur Arbeit bringen. Unser Problem ist, dass wir mit der unten angegebenen PatchRequest eine neue Eigenschaft mit dem Namen Id in der Datenbank haben, aber die tatsächliche ID hat immer noch denselben Wert (siehe Screenshot). Gibt es eine bessere (korrekte) Möglichkeit, den Wert einer ID zu ändern?

Das Entity:

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

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

    public string TempUniqueNetName{ get; set; } 
} 

Wir wollen so etwas tun:

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

Value has not changed

Antwort

5

Ich glaube nicht, dass Sie den Dokumentschlüssel über Patching ändern können. Es wird nicht wirklich mit dem Dokument oder den Metadaten gespeichert - es wird beim Laden in die @id-Metadaten kopiert, um Ihnen die Illusion zu vermitteln, dass es da ist, und der Raven-Client kopiert es erneut in Ihre eigene Identitätseigenschaft im Dokument. Aber wirklich, es ist ein separater Wert im zugrunde liegenden esent Dokumentenspeicher. Raven müsste genau wissen, wie man damit umgeht und es für dich vortäuscht.

Sie könnten das Dokument manuell von der alten ID in die neue kopieren und die alte löschen, aber das könnte zeitaufwendig sein.

Es gibt keine gute Antwort zum Umbenennen eines Dokumentschlüssels. Es sollte wirklich einen DatabaseCommand geben, um ein einzelnes Dokument erneut zu keyen und PatchCommandType zu trennen, wenn es patchen wird. Vielleicht wird das dem Raben in Zukunft hinzugefügt.

+0

Posted Anfrage hier: http://issues.hibernatingrhinos.com/issue/RavenDB-801 –

+0

Ok, danke für deine Antwort. Wir werden wahrscheinlich Ihren Vorschlag verwenden und das Dokument kopieren. Es ist eine einmalige Sache, also ist es egal, dass es eine Weile dauern wird. Hoffentlich wird es das nächste Mal, wenn wir das brauchen, implementiert werden. –

+1

FYI: Die RavenDB Devs haben geantwortet, dass sie dieses Feature nicht hinzufügen werden und stattdessen "Es kann vom Benutzer als ein Transaktionspaar von delete/put relativ einfach implementiert werden . " –