c# - redefinición - NHibernate: una clase base, varias asignaciones
utilice la palabra new para crear una instancia de objeto c# (5)
Soy relativamente nuevo en NHibernate, pero lo he usado en los últimos programas y estoy enamorado. Llegué a una situación en la que necesito agregar datos de 4 a 5 bases de datos en una única base de datos. Específicamente es datos de número de serie. Cada base de datos tendrá su propio archivo de mapeo, pero finalmente todas las entidades comparten la misma estructura básica (clase en serie).
Entiendo que NHibernate quiere un mapeo por clase, por lo que mi pensamiento inicial fue tener una clase de serie base y luego heredar de ella para cada base de datos diferente y crear un archivo de mapeo único (la clase heredada tendría cero contenido). Esto debería funcionar muy bien para capturar todos los datos y poblar los objetos. Lo que me gustaría hacer es guardar estas clases heredadas (no estoy seguro de cuál es el término correcto) para la tabla de la clase base usando el mapeo de la clase base.
El problema es que no tengo idea de cómo forzar a NHIbernate a usar un archivo de mapeo específico para un objeto. Al convertir la clase heredada en la clase base no se hace nada cuando se usa ''session.save ()'' (no se queja de mapeo).
¿Hay alguna forma de especificar explícitamente qué mapeo usar? ¿O solo me falta algún principio OOP para lanzar de forma más específica una clase heredada a la clase base? ¿O esta idea es mala?
Todas las cosas de herencia que pude encontrar con respecto a NHibernate (Capítulo 8) no parecen ser totalmente aplicables a esta función, pero podría estar equivocado (la tabla-por-hormigón-clase parece útil, pero no puedo " Me vuelvo totalmente consciente de cómo NHibernate se da cuenta de qué hacer.
Esto podría ayudar;
Usando NHibernate con múltiples bases de datos
Del artículo;
Introducción
... descrito usando NHibernate con ASP.NET; ofreció pautas para comunicarse con una sola base de datos. Pero a veces es necesario comunicarse con múltiples bases de datos al mismo tiempo. Para que NHibernate haga esto, debe existir una fábrica de sesiones para cada base de datos con la que se comunicará. Pero, como suele ser el caso con múltiples bases de datos, algunas de las bases de datos rara vez se utilizan. Entonces, puede ser una buena idea no crear fábricas de sesión hasta que realmente se necesiten. Este artículo retoma el artículo anterior de NHibernate con ASP.NET y describe los detalles de implementación de este enfoque simple. Aunque el artículo anterior se centró en ASP.NET, la sugerencia a continuación es compatible tanto con ASP.NET como con .NET.
...
Lo primero que debe hacer cuando trabaja con múltiples bases de datos es configurar las comunicaciones adecuadas. Cree un archivo de configuración separado para cada base de datos, colóquelos en una carpeta de configuración central y luego hágalos referenciar desde la web / app.config.
...
No sé si esto ayudará, pero yo no trataría de hacer eso, básicamente.
Esencialmente, creo que posiblemente estés sufriendo del síndrome del "martillo golder": cuando tienes un martillo REALMENTE REALMENTE bueno (es decir, Hibernate (y comparto tu opinión sobre él, es una herramienta MAGNÍFICA)), todo parece un clavo.
Por lo general, intento simplemente tener una clase de "conversión manual", es decir, una que tiene constructores que toman las clases de hibernación para sus clases de serie individuales y que simplemente copia los datos en su propio formato específico; luego, Hibernate simplemente puede serializarlo en la (única) base de datos usando su propia asignación.
Efectivamente, la razón por la que creo que esta es una solución mejor es que lo que estás tratando de hacer es tener una serialización asimétrica en tu clase; es decir, leer desde una base de datos en su clase derivada, escribir en otra base de datos en su clase base. Nada realmente horrible sobre eso, realmente, excepto que es fundamentalmente un proceso unidireccional; si realmente desea la conversión de una base de datos a otra, simplemente realice la conversión y termine con ella.
No estoy 100% seguro de que esto hará lo que necesito, pero hoy encontré esto en Google sobre NHibernate y tipos anónimos:
http://infozerk.com/averyblog/refactoring-using-object-constructors-in-hql-with-nhibernate/
La parte interesante (para mí, soy nuevo en esto) es la palabra clave ''nueva'' en la cláusula de selección HQL. Entonces, lo que podría hacer es seleccionar el SerialX de DatabaseX usando mappingX, y pasarlo a un constructor para SerialY (el Serial general / base). Así que ahora me he generado en serie de mappingX / databaseX, y (con suerte) podría entonces session.save y NHibernate usará mappingY / databaseY.
La razón por la que me gusta es simplemente no tener dos clases con la misma información persistida (¡creo!). Realmente no hay diferencia funcional entre esto y devolver una lista de SerialX, iterar a través de ella, generar SerialY y agregarlo a una nueva lista (la primera y mejor respuesta dada).
Esto no tiene el beneficio más general de crear casos útiles para las asignaciones de NHibernate con herencia, pero creo que hará las cosas limitadas que quiero.
Si bien es cierto, necesitarás un archivo / clase de mapeo para cada una de esas tablas, no hay nada que te impida hacer que todas esas clases implementen una interfaz común.
A continuación, puede agregarlos todos juntos en una sola colección en la capa de su aplicación (es decir, la Lista) donde cada una de esas clases implementa la Lista)
Probablemente tendrá que escribir algunas tuberías para mantener un registro de la sesión para almacenarla (ya que está apuntando a múltiples bases de datos) si desea hacer actualizaciones. Pero el proceso para hacerlo variará en función de cómo haya configurado las cosas.
Escribí una publicación muy larga con código y todo para responder a Dan. Terminó, creo que me perdí lo obvio.
public class Serial
{
public string SerialNumber {get; set;}
public string ItemNumber {get; set;}
public string OrderNumber {get; set;}
}
...
Serial serial = sessionX.get(typeof(Serial), someID);
sessionY.save(serial);
NHibernate debe usar mappingX para get y mappingY para guardar, ya que las sesiones no se comparten, y la asignación está vinculada a la sesión. De modo que puedo tener 2 asignaciones apuntando a la misma clase porque en una sesión en particular solo hay una relación de asignación a clase.
Al menos creo que ese es el caso (no puedo probar atm).
Lamentablemente, este caso específico es realmente aburrido y no es útil. En un programa diferente del mismo dominio, me deriva de la clase base para una parte específica de la lógica empresarial. No quería crear un archivo de mapeo ya que era solo para hacer un pequeño fragmento de código más fácil. De todos modos, no pude hacer que funcione en NHibernate debido a las mismas razones que mi primera pregunta y sí hice el método que McWafflestix describe para evitarlo (ya que era de poca importancia).
Dicho esto, he encontrado esto a través de google:
http://jira.nhibernate.org/browse/NH-662
Esa es exactamente la misma situación, y parece (posiblemente) abordado en NH 2.1+? Aún no lo he seguido.
(nota: Dan, en mi caso obtengo de varios DB, solo escribo en uno. Todavía estoy interesado en su sugerencia sobre la interfaz porque creo que es una buena idea para otros casos. ¿Definiría el mapeo contra el Si trato de guardar una clase que implemente la interfaz que no tiene una definición de mapeo, ¿usaría NHibernate la asignación de interfaz? ¿O tendría que declarar subcatas vacías en la asignación para cada clase que implementa la asignación de interfaz?