2010-10-29 12 views
8

Estoy usando Nhibernate (soy un novato completo), y lo que quiero ser capaz de hacer es copiar una entidad que se carga de la base de datos y guardarla con una nueva Id. .. ¿alguien se ha encontrado con esta situación? Cualquier ayuda será muy apreciada.Cómo copio un objeto con NHibernate

Respuesta

5

tengo que hacer exactamente esto para un conjunto muy complejo de objetos y lo que he encontrado hasta ahora es:

NHibernate no soporta exactamente esto.

Si intenta simplemente reemplazar la identificación de un objeto que obtuvo de una sesión, obtendrá un error Nhibernate: identificador de una instancia de fue alterado de < 9ae3868d-17bf-4314-ba0c-4eb3b44b1a2e> a < 2b2b67c6 -a421-48c4-836c-4c27f6481718>

Si la sesión ya no sabe acerca de los objetos que recuperó, es decir, si los desaloja antes de guardar y enjuagar, simplemente cambiar los identificadores ahora funcionará. Así se podría escribir código como este:

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(); 


    } 

El problema con esto es que si el gráfico de objetos tiene cualquier profundidad que tiene que estar seguro de desalojar a todo el conjunto, y entonces puede que tenga los originales en la sesión todavía le tener que recuperarlos de nuevo. Este es un dolor de cabeza logístico y arroja un código con intenciones muy oscuras e intrincadas.

No lo recomiendo.

Lo que se suele hacer es serializar a una secuencia binaria y reconstituir esta secuencia en un nuevo conjunto de objetos. Bien, pero solo funciona si tus objetos son todos serializables.

Ese no es el caso para mí, lo que estoy haciendo es escribir código manual para hacer copias en profundidad de un gráfico de objetos utilizando constructores de copia. Esto es complejo y también puede generar problemas de mantenimiento, pero si los objetos no se pueden serializar, existen pocas alternativas mejores.

Lo sentimos, la copia profunda de objetos sigue siendo una tarea complicada si la serialización no es una opción.

+0

Gracias por las sugerencias Sisyphus, tenía miedo de lo que acaba de sugerir, pero afortunadamente tengo la comodidad de tener todos mis objetos de entidad serializables. Lo probaré y te haré saber cómo funciona. – PCG

9

Simplemente haga new MyClass() y copie todo excepto el Id. Puedes usar reflejo para eso.

+1

+1: Esto es lo que hacemos; puede usar automapper o valueinjecter para realizar la copia también; solo haz que ignore la identificación (obviamente). – DanP

+0

en segundo lugar para el usuario Automapper. eso funcionó para mí, con un mínimo esfuerzo. – fregas

Cuestiones relacionadas