(N)Hibernate - est-il possible de mapper dynamiquement plusieurs tables à une seule classe

StackOverflow https://stackoverflow.com/questions/51654

Question

J'ai la situation où j'utilise un logiciel SIG qui stocke les informations sur les objets SIG dans une table de base de données distincte pour chaque type/classe d'objet SIG (route, rivière, bâtiment, mer, ...) et conserve la table de métadonnées dans laquelle il stocke des informations sur le nom de la classe et sa table DB.

Ces objets SIG de différentes classes partagent certains paramètres, c'est-à-direDescription et identifiant.J'aimerais représenter toutes ces différentes classes SIG avec une classe C# commune (appelons-la GisObject), ce qui est suffisant pour ce que je dois faire à partir de la partie non SIG de l'application qui répertorie les objets SIG du SIG donné. classe.

Le problème pour moi est de savoir comment mapper ces objets à l'aide de NHibernate pour expliquer à NHibernate lors de la création d'un GisObject C# pour recevoir et utiliser le nom de la table comme paramètre qui sera lu à partir de la méta-table (cela peut se faire en deux étapes, je peux récupérer manuellement le nom de la table dans la première étape, puis le transmettre à NHibernate lors de l'extraction des données GisObject).

Quelqu'un a-t-il été confronté à ce genre de situation et est-il possible de le faire ?

Était-ce utile?

La solution 2

@Brian Chiasson

Malheureusement, il n'est pas possible de créer toutes les classes de données SIG, car les classes sont créées dynamiquement dans l'application.Chaque donnée SIG du même type doit être une classe, mais mon utilisateur a la possibilité d'obtenir un nouvel ensemble de données et de le mettre dans la base de données.Je ne peux pas savoir à l'avance quelles classes mon utilisateur aura dans l'application.Par conséquent, le modèle de mappage frontal par classe ne fonctionne pas car demain, il y aura une autre nouvelle table de base de données et il faudra créer une nouvelle classe avec un nouveau mappage.

@Al il pourrait y avoir une possibilité d'écrire ma propre requête personnalisée dans le fichier de configuration XML de ma classe GisObject, puis dans la classe d'accès aux données, récupérant cette requête en utilisant le

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

et utilisez la chaîne de remplacement pour injecter le nom de la base de données (en remplaçant une chaîne d'espace réservé) que je passerai en paramètre.

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

Que pensez-vous de cette solution ?Je sais que cela pourrait constituer un risque de sécurité dans un environnement non contrôlé où le nom de la table serait récupéré en tant qu'entrée utilisateur, mais dans ce cas, j'ai une méta-table contenant des noms de table corrects et valides pour les classes de données SIG que je lirai avant. appeler la requête pour récupérer des données pour la classe spécifique d'objets SIG.

Autres conseils

Il semble que la chose la plus simple à faire ici soit de créer une classe de base abstraite avec tous les membres SIG communs, puis d'hériter des autres classes X qui n'auront rien de plus que les mappages NHibernate nécessaires.J'utiliserais ensuite le modèle Factory pour créer l'objet du type spécifique à l'aide de vos métadonnées.

une façon de procéder est de déclarer une interface, par exemple IGisObject, qui possède les propriétés communes déclarées sur l'interface.Implémentez ensuite une classe concrète qui correspond à chaque table.De cette façon, ils seront toujours tous de type IGisObject.

Vous pouvez consulter ce que dit Ayende ici : Entités multitables.

Mais comme vous avez des tables séparées, je ne pense pas que cela fonctionnera.Vous pouvez également consulter groupe d'utilisateurs

Je suppose que je poserais la question de savoir pourquoi vous recherchez les données SIG directement dans la base de données et n'utilisez pas l'API qui vous est généralement fournie comme abstraction.S'il s'agit d'un système ESRI, il existe des outils qui vous permettent de créer des vues de base de données statiques dans leurs objets SIG et peut-être qu'à partir de ce point, cela pourrait être approprié pour l'extraction de données.

À partir de la documentation NHibernate, vous pouvez utiliser l'un des mappages d'héritage.

Vous pouvez également avoir une classe distincte pour chaque table, mais demandez-leur toutes d'implémenter une interface commune

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top