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
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.
Simplemente haga new MyClass()
y copie todo excepto el Id. Puedes usar reflejo para eso.
- 1. ¿Cómo copio en profundidad un objeto DateTime?
- 2. ¿Cómo copio un objeto en Qt?
- 3. Cómo eliminar un objeto secundario en NHibernate?
- 4. ¿Cómo copio los datos de un elemento con jQuery?
- 5. ¿Cómo copio archivos en un JAR existente con Ant?
- 6. Cómo copio datos binarios a un stringstream
- 7. ¿Cómo copio una imagen y texto en el portapapeles como un solo objeto?
- 8. ¿Cómo serializar todas las propiedades de un objeto mapeado-NHibernate?
- 9. ¿Cómo copio/clono un repositorio git sin perder espacio?
- 10. Cómo "Select" con queryover nhibernate
- 11. Comprobar si existe un objeto en la base de datos sin cargar el objeto con NHibernate
- 12. ¿Cómo copio un archivo de un servidor a otro?
- 13. NHibernate correspondencia NULL Objeto/Patrón Caso especial
- 14. Desconectar objeto de la sesión de NHibernate
- 15. ¿Cómo copio un directorio a una máquina remota usando Fabric?
- 16. ¿Cómo copio en profundidad un Proc en Ruby?
- 17. ¿Cómo copio manualmente ensamblajes en el GAC?
- 18. ¿Cómo copio texto de mi xterm sin un mouse?
- 19. ¿Cómo copio ** kwargs a mí mismo?
- 20. Cómo configurar nHibernate con MySQL
- 21. Cómo integrar NHibernate con Lucene.Net
- 22. Ciclo de vida del objeto en NHibernate
- 23. ¿Cómo copio enlaces simbólicos en Perl?
- 24. Cómo mapear IDictionary <cadena, objeto> en Fluidez NHibernate?
- 25. ¿Cómo copio una pila en Java?
- 26. Fluido NHibernate obtener ID del objeto guardado
- 27. ¿Cómo combino un objeto java.util.Date con un objeto java.sql.Time?
- 28. ¿Cómo copio una imagen remota en python?
- 29. Cómo copio datos entre tablas PostgreSQL
- 30. ¿Puedo separar un objeto de una sesión de NHibernate?
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