2010-10-29 12 views
8

Sto usando Nhibernate (sono un noob completo) e quello che voglio essere in grado di fare è copiare un'entità che viene caricata dal database e salvarla con un nuovo Id. .. qualcuno ha incontrato questa situazione? Qualsiasi aiuto sarebbe molto apprezzato.Come copiare un oggetto con NHibernate

risposta

5

ho bisogno di fare esattamente questo per una serie molto complessa di oggetti e quello che ho trovato finora è:

NHibernate non è esattamente supporta questa.

Se si tenta di sostituire semplicemente l'ID di un oggetto che hai da una sessione, si otterrà un errore NHibernate: identificatore di un'istanza di stato alterato da < 9ae3868d-17bf-4314-ba0c-4eb3b44b1a2e> a < 2b2b67c6 -a421-48c4-836c-4c27f6481718>

Se la sessione non è più in grado di conoscere gli oggetti recuperati, ovvero se li si sfrutta prima di salvare e svuotare, la semplice modifica degli ID ora funzionerà. Quindi, si potrebbe scrivere codice come questo:

public void CloneStudent(Guid studentId) 
    { 
     // Get existing student 
     Student student = _session.Get<Student>(studentId); 

     // Copy by reference 
     Student newStudent = student; 

     // Reset Id to do quick and dirty clone 
     newStudent.Id = Guid.NewGuid(); 
     newStudent.Sticker = "D"; 

     // Must evict existing object or Nhibernate will throw object modified error 
     _session.Evict(student); 

     // Save new object 
     _session.Save(newStudent); 
     _session.Flush(); 


    } 

Il problema di questo è se il grafico oggetto ha qualsiasi profondità si deve essere sicuri di sfrattare l'intero set, e quindi potrebbe essere necessario gli originali nella sessione ancora ti devo recuperarli di nuovo. Questo è un mal di testa logistico e produce codice con intenzioni molto oscure e contorte.

Non lo consiglio.

Ciò che è più comunemente fatto è serializzare su un flusso binario e ricostituire questo flusso in un nuovo gruppo di oggetti. Bene, ma funziona solo se i tuoi oggetti sono tutti serializzabili.

Questo non è il caso per me, quello che sto facendo è che ho scritto il codice manuale per creare copie profonde di un oggetto grafico usando i costruttori di copia. Questo è complesso e può anche portare a problemi di manutenzione, ma se gli oggetti non possono essere serializzati ci sono poche alternative migliori.

Spiacente, la copia profonda degli oggetti rimane un'operazione complicata se la serializzazione non è un'opzione.

+0

Grazie per i suggerimenti Sisyphus, avevo paura di ciò che hai appena suggerito, ma fortunatamente ho la comodità di avere tutti gli oggetti della mia entità serializzabili. Farò un tentativo e ti faccio sapere come funziona. – PCG

9

Basta fare new MyClass() e copiare tutto tranne l'Id. Puoi usare la riflessione per quello.

+1

+1: questo è ciò che facciamo; puoi usare automapper o valueinjecter per eseguire anche la copia; devi solo ignorare l'id (ovviamente). – DanP

+0

I secondo per l'automapper utente. quello ha funzionato per me, con il minimo sforzo. – fregas

Problemi correlati