Pregunta

Tengo la situación en la que uso un software SIG que almacena la información sobre objetos SIG en una tabla de base de datos separada para cada tipo/clase de objeto SIG (carretera, río, edificio, mar,...) y mantiene la tabla de metadatos en la que se almacena. información sobre el nombre de la clase y su tabla DB.

Esos objetos SIG de diferentes clases comparten algunos parámetros, es decirDescripción e identificación.Me gustaría representar todas estas clases SIG diferentes con una clase C# común (llamémosla GisObject), que es suficiente para lo que necesito hacer desde la parte no SIG de la aplicación que enumera los objetos SIG del SIG dado. clase.

El problema para mí es cómo mapear esos objetos usando NHibernate para explicarle a NHibernate cuándo se crea un C# GisObject para recibir y utilizar el nombre de la tabla como parámetro que se leerá de la metatabla (puede ser en dos pasos, puedo recuperar manualmente el nombre de la tabla en el primer paso y luego pasarlo a NHibernate al extraer datos de GisObject).

¿Alguien ha lidiado con este tipo de situación? ¿Se puede hacer?

¿Fue útil?

Solución 2

@Brian Chiasson

Desafortunadamente, no es una opción crear todas las clases de datos SIG porque las clases se crean dinámicamente en la aplicación.Todos los datos SIG del mismo tipo deberían ser una clase, pero mi usuario tiene la posibilidad de obtener un nuevo conjunto de datos y colocarlos en la base de datos.No puedo saber de antemano qué clases tendrá mi usuario en la aplicación.Por lo tanto, el modelo de mapeo por clase frontal no funciona porque mañana habrá otra nueva tabla de base de datos y será necesario crear una nueva clase con un nuevo mapeo.

@en general, puede haber la posibilidad de escribir mi propia consulta personalizada en el archivo de configuración XML de mi clase GisObject, luego en la clase de acceso de datos obteniendo esa consulta utilizando la

string qs = getSession().getNamedQuery(queryName);

y use la cadena reemplazar para inyectar el nombre de la base de datos (reemplazando alguna cadena de marcador de posición) que pasaré como parámetro.

qs = qs.replace(":tablename:", tableName);

¿Cómo te sientes acerca de esa solución?Sé que podría ser un riesgo de seguridad en un entorno no controlado donde el nombre de la tabla se recuperaría como entrada del usuario, pero en este caso, tengo una metatabla que contiene nombres de tabla correctos y válidos para las clases de datos SIG que leeré antes. llamar a la consulta para obtener datos para la clase específica de objetos SIG.

Otros consejos

Parece que lo más sencillo de hacer aquí puede ser crear una clase base abstracta con todos los miembros SIG comunes y luego heredar las otras clases X que no tendrán más que las asignaciones necesarias de NHibernate.Luego usaría el patrón Factory para crear el objeto del tipo específico usando sus metadatos.

Una forma de hacerlo es declarar una interfaz, digamos IGIsObject, que tenga las propiedades comunes declaradas en la interfaz.Luego implemente una clase concreta que se asigne a cada tabla.De esa manera seguirán siendo todos del tipo IGisObject.

Puedes echar un vistazo a lo que dice Ayende aquí: Entidades multitabla.

Pero como tienes tablas separadas, no creo que funcione.También puedes consultar grupo de usuarios

Supongo que haría la pregunta de por qué busca los datos SIG directamente en la base de datos y no utiliza la API que normalmente se proporciona como una abstracción para usted.Si se trata de un sistema ESRI, existen herramientas que le permiten crear vistas de bases de datos estáticas en sus objetos SIG y entonces tal vez desde ese punto podría ser apropiado para la extracción de datos.

De la documentación de NHibernate, puede usar uno de los mapeos de herencia.

También puede tener una clase separada para cada tabla, pero hacer que todas implementen alguna interfaz común.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top