2013-01-03 14 views
5

Abbiamo un'entità denominata Organizzazione su cui usiamo il UniqueConstraints-bundle. Abbiamo una proprietà denominata NetName che è un UniqueConstraint e un ID generato automaticamente.Cambiare il valore di un Id in RavenDB

Poiché ciò non è necessario, si desidera utilizzare la proprietà NetName come ID. In modo che non abbiamo bisogno di UniqueConstraints per sapere che è unico e anche ottenere il vantaggio di essere in grado di utilizzare Load quando abbiamo il NetName.

avevamo bisogno di ripulire il nostro netname un po 'prima di utilizzarlo come un Id così abbiamo creato un nuovo temporaneo proprietà denominata TempUniqueNetName che detiene ora il valore di:

"organizations/"+ CleanupId(this.NetName) 

Così siamo ora pronti per semplicemente sposta quel valore nel nostro ID. Ma non possiamo farlo funzionare. Il nostro problema è che con PatchRequest di seguito ci ritroviamo con una nuova proprietà denominata Id nel database ma l'Id effettivo ha ancora lo stesso valore (vedi screenshot). Esiste un modo migliore (corretto) per modificare il valore di un ID?

L'Entità:

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

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

    public string TempUniqueNetName{ get; set; } 
} 

Vogliamo fare qualcosa di simile:

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

Value has not changed

risposta

5

non credo che si può cambiare la chiave del documento tramite patch. Non è in realtà memorizzato con il documento o i metadati - è copiato nei metadati @id sul carico per darti l'illusione che sia lì, e il client Raven lo copia di nuovo nella tua proprietà di identità nel documento. Ma in realtà, è un valore separato nel negozio di documenti esente sottostante. Raven dovrebbe sapere in particolare come gestirlo e fingere per te.

È possibile copiare manualmente il documento dall'ID precedente a quello nuovo ed eliminare il vecchio, ma ciò potrebbe richiedere molto tempo.

Non c'è una grande risposta per rinominare un documento chiave in questo momento. Ci dovrebbe essere davvero un DatabaseCommand per reimpostare un singolo documento e separare PatchCommandType da rekey durante l'applicazione delle patch. Forse questo sarà aggiunto al corvo in futuro.

+0

richiesta Posted qui: http://issues.hibernatingrhinos.com/issue/RavenDB-801 –

+0

Ok, grazie per la risposta. Probabilmente useremo il tuo suggerimento e copierò il documento. È una cosa sola, quindi non importa che ci vorrà un po '. Speriamo che venga implementato la prossima volta che ne abbiamo bisogno :) –

+1

FYI: Gli sviluppatori di RavenDB hanno risposto che non aggiungeranno questa funzione e invece "Può essere implementato dall'utente come una coppia transazionale di eliminazione/inserimento abbastanza facilmente ". –