Comment puis-je exploiter un ORM pour une base de données dont le schéma est inconnu jusqu'au moment de l'exécution?

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

Question

J'essaie de tirer parti de ORM compte tenu des exigences suivantes:

1) Utilisation de .NET Framework (le dernier framework est correct)
2) Doit pouvoir utiliser Sybase, Oracle et MSSQL de façon interchangeable
3) Le schéma est principalement statique, MAIS il y a des parties dynamiques.

Je connais un peu SubSonic et NHibernate, mais pas profondément.
J'ai l'impression que l'ORM peut faire ce que je veux, mais je ne sais pas comment en tirer parti pour le moment.

SubSonic n’est probablement pas optimal, car il ne prend actuellement pas en charge Sybase, et écrire pour mon propre fournisseur, c’est au-delà de mes ressources et de mes capacités actuellement.

Pour le numéro 3 (ci-dessus), il existe quelques tables de métadonnées, qui décrivent les tables que les fournisseurs peuvent "agrafer", à la base de données existante.
Appelons ces MetaTables et MetaFields .

Il existe un schéma statique de base, que l'ORM (NHibernate ATM) gère bien.
Toutefois , un fournisseur peut ajouter (physiquement) une table à la base de données, à condition d'ajouter les données aux tables de métadonnées pour décrire sa structure.

Ce que j’aimerais vraiment, c’est que je puisse "nourrir" d’une manière ou d’une autre l'ORM avec ces métadonnées (d'une manière qu'il comprend) et les avoir à ce moment-là me permet de manipuler les données.

Mon objectif principal est de réduire la quantité d'instruction SQL générique à créer sur ces tables dynamiques.
J'aimerais également éviter de m'inquiéter des différences de SQL envoyées à Sybase, Oracle ou MSSQL.

Mon principal problème est que je ne dispose pas d'un moyen d'informer ORM des tables dynamiques jusqu'à l'exécution, lorsque j'aurai accès aux métadonnées

Modifier : voici un exemple d'utilisation: décrit ici :

IDataReader rdr = nouvelle requête ("DynamicTable1"). WHERE ("ArbitraryId", 2) .ExecuteReader ();

(Cependant, il ne semble pas que SubSonic fonctionne, car il n'y a pas de fournisseur Sybase (voir ci-dessus)

Était-ce utile?

La solution

Selon ce blog, vous pouvez utiliser NHibernate avec cartographie dynamique . Il faut cependant un peu de peaufinage ...

Autres conseils

Nous avons utilisé une partie de NHibernate, mais nous avons arrêté le projet car il ne nous fournissait pas le retour sur investissement que nous souhaitions. Nous avons fini par écrire notre propre couche ORM / SQL qui fonctionnait très bien (cela fonctionne puisque je n’y travaille plus, je suppose que cela fonctionne toujours).

Notre système a utilisé un projet open source pour générer le code SQL (vous ne vous en souvenez plus du nom) et nous avons construit toutes nos requêtes dans notre propre langage basé sur XML (Query Markup Language - QML). Nous pourrions ensuite créer un document xmlDocument avec selects, wherees, groupes, etc., puis l'envoyer au SqlEngine qui le transformerait en une instruction Sql et l'exécuterait. Nous discutions, mais jamais mis en œuvre, une cache dans tout cela. Cela nous aurait permis de mettre en cache les fichiers Qml pour les requêtes fréquemment utilisées.

Je suis un peu confus quant à la manière dont l’ORM serait utilisé lors de l’exécution? Si l'ORM construit dynamiquement quelque chose au moment de l'exécution, comment le code d'exécution sait-il ce que l'ORM a fait dynamiquement?

"à ce moment-là, permettez-moi de manipuler les données" - Qu'est-ce que manipuler les données?

Il se peut que je manque quelque chose ici et j’applogise si c’est le cas. (Je n'ai vraiment utilisé l'approche ascendante qu'avec ORM)

IDataReader ne mappe quoi que ce soit avec un objet que vous connaissez. Votre exemple doit donc être écrit avec un constructeur de requêtes classique.

Avez-vous envisagé d'utiliser ADO.NET Entity Framework?

MSDN: LINQ aux entités

Il vous permet de mapper les tables de base de données sur un modèle objet de manière à pouvoir coder sans se préoccuper du fournisseur de base de données utilisé ni des modifications mineures apportées par un administrateur de base de données aux tables réelles. Le mappage est conservé dans des fichiers de configuration qui peuvent être modifiés lorsque les tables de la base de données sont modifiées sans nécessiter de recompilation.

En outre, à l'aide de LINQ to Entities, vous pouvez créer des requêtes de manière OO, de sorte que vous n'écriviez pas de chaînes de requête SQL réelles.

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