2008-10-31 14 views
12

Tengo una aplicación de escritorio (winforms) que usa una base de datos Firebird como almacén de datos (en modo incrustado) y uso NHibernate para ORM. Una de las funciones que debemos respaldar es poder importar/exportar grupos de datos a/desde un archivo externo. Actualmente, este archivo externo también es una base de datos con el mismo esquema que la base de datos principal.Copiando entidades entre múltiples bases de datos con NHibernate

Ya tengo instalado NHibernate para ver varias bases de datos y puedo trabajar con dos bases de datos al mismo tiempo. El problema, sin embargo, es copiar datos entre las dos bases de datos. Tengo dos estrategias de copia: (1) copie con las mismas ID para los objetos [también conocido como importación/exportación] y (2) copie con la mayoría de las nuevas ID [también conocido como duplicado/copia]. Digo "principalmente nuevo" porque hay algunos elementos de búsqueda que siempre se copiarán con la misma ID.

Copiar todo con nuevos ID está bien, porque solo tendré un método "CopyForExport" que puede crear copias de todo y no asignar nuevos ID (o borrar todos los ID en el árbol de objetos).

¿Cuál es la forma de "mejores prácticas" para manejar esta situación y copiar datos entre bases de datos manteniendo los mismos ID?

Aclaración: No estoy tratando de sincronizar dos bases de datos, solo exportar un subconjunto (seleccionable por el usuario) o datos para transferir a otra persona (que luego importará el subconjunto de datos en su propia base de datos).

Más aclaración: Creo que he aislado el problema hasta aquí: Quiero utilizar la función ISession.SaveOrUpdate de NHibernate, así que configuré mis entidades con un generador de identidad que no está "asignado". Sin embargo, tengo un problema cuando quiero anular la identidad generada (para copiar datos entre múltiples bases de datos en el mismo proceso).

Hay una manera de utilizar un generador Guid.Comb o UUID, pero a veces puedo especificar mi propio identificador (para transferir a una conexión de base de datos diferente con el mismo esquema).

Respuesta

13

Encontré la respuesta a mi propia pregunta: La clave es el método ISession.Replicate. Esto le permite copiar gráficos de objetos entre almacenes de datos y mantener el mismo identificador. Para crear nuevos identificadores, creo que puedo usar ISession.Merge, pero aún tengo que verificar esto.

Sin embargo, hay algunas advertencias: mi clase de prueba tiene una referencia al objeto primario (relación uno a uno) y tuve que hacer que la clase no se cargara de forma diferida para que Replicate funcione correctamente. Si no lo tuviera configurado para una carga ansiosa (supongo que no es una carga lenta), solo replicaría el objeto y no el objeto principal (cascade = "all" en mi archivo hbm.xml).

Los documentos de java Hibernate tienen una referencia a Replicate(), pero la documentación de NHibernate no (section 10.9 en los documentos de Java).

Esto tiene sentido para el comportamiento Replicar porque queremos tener entidades totalmente hidratadas antes de transferirlas a otro almacén de datos. Sin embargo, lo más extraño es que incluso con ambas sesiones abiertas (una para cada almacén de datos), no se pensó en hidratar el objeto cuando quería replicarlo.

+0

Finalmente encontré esta solución, estaba teniendo un problema similar. Supongo que no ayudó que el sitio de hibernación estuviera actualmente fuera de servicio. – LizB

0

Puede usar FBCopy para esto. Simplemente defina qué tablas y columnas quiere copiar y yo haré el trabajo. También puede agregar la cláusula WHERE opcional para cada tabla, por lo que solo copiará las filas que desee.

Al copiar, se garantiza que se mantiene el orden de los datos que se exportan, de modo que las claves externas no se rompan. También es compatible con generadores.

Cuestiones relacionadas