Enty Framework / Oracle Spacial / Code First Migration : besoin d'aide
Bonjour à toutes et à tous.
Entity Framework et Oracle, quelle galère !
Ça fait bientôt 15 jours que je passe pour créer un squelette d'application avec Entity Framework pour oracle (en code First).
C'est sur aussi, je pars avec des handicaps, des choix techniques décidé par mes supérieurs qui sont d'ailleurs je pense des bonnes solutions mais plus complexes à mettre en oeuvre que ce qu'ils pensaient.
Petit historique...
- Galère pour une première connexion avec la base de données Oracle :
- 127.0.0.1 au lieu de localhost et ça fonctionne pas
- Problème avec le nom de l'écouteur
- Problème de driver
- Utilisation de EntityFramework.
- Utilisation de notre base de données interne Oracle.
- Utilisation d'Oracle en tant que base de données Spatiale.
- Puisque base de données Spaciale, EntityFramework utilise .NET Framework 4.5 => Compatibilité uniquement avec SEVEN : inacceptable
- Utilisation d'EntityFramework 6.0 Beta + .Net Framework 4 (compatible XP)
- ODP.Net ne supporte les bases de données spaciales qu'avec .Net Framework 4.5 => changement de fournisseur de données
- Changement de fournisseur : utilisation de dotConnet + la partie spaciale..
- Un vrai bordel à configurer le fichier app.config pour que celà fonctionne.
- Enfin, première connexion à la base
- Enfin, première connexion à la base + création de la BDD automatique avec Code First
- Enfin, première connexion à la base + création de la BDD automatique avec Code First avec des colonnes de type DbGeometry
- Maintenant que celà fonctionne il faut penser à la suite la modification du modèle avec CodeFirst Migration car actuellement si le modèle change, l'application ne démarre plus (exception).
Voilà, j'en suis la et je me pose deux questions :
- Comment faire fonctionner Code First Migration avec dotConnect ?
En effet, le tutoriel indique
Citation:
Dans les options de scaffolding, vous devez sélectionner la classe Customer. Dans la zone Data context class, vous allez utiliser " New data context…>. Renseignez le nom du Data Context " DatabaseMigrationContext ". Validez ensuite sur OK et cliquez enfin sur Ajouter.
Seulement je ne sais pas comment il arrive à la boite situé juste en dessous et surtout ce qu'est options de scaffolding ?
- Ce que je ne sais pas c'est comment réagi et comment est géré Code First Migration lorsque plusieurs versions de programmes sont lancées simultanément. Je m'explique :
- Création d'une version 1.0 => La base est créée.
- Création d'une version 1.1 => La base est migrée. Que se passe-t-il alors si tous les utilisateurs n'ont pas changés d'applications et sont restée en 1.0 ? Le lancement de l'application en 1.0 va migrer le modèle de la base de 1.1 => 1.0 ?
- Que se passe-t-il si un programme version 1.0 est lancé et pendant ce temps un autre en 1.1 migre le modèle en 1.1 ? Le programme lancé en 1.0 risque de faire n'iimporte quoi ?
Pour le (a) j'avais pensé créer une table Générale avec le n° de version du modèle (j'ai l'impression que je refais ce que fait CodeFirst Migration). Si le programme lancé à un modèle < au modèle de la base, il refuse de se lancer car il est obsolète, hélas ça ne résoud pas le (b).
J'ai aussi besoin d'un message personnalisé dans le SpashScreen (mise à jour du modèle), or à chaque première ouverture de la BDD par Code First dans le programme (première fois seulement), la fonctrion virtuelle protected override void OnModelCreating(DbModelBuilder _modelBuilder) est systématiquement appelée que le modèle de la base soit à jour ou pas. Comment savoir si le modèle est à jour ou pas pour :
- Afficher un message "Création du modèle de la base de donnée" si le modèle n'a jamais été créé : (est-ce que la table General existe ou pas par exemple)
- Afficher un message "Mise à jour du modèle de la base de donnée" si le modèle a déjà été créé et qu'il va falloir le mettre à jour.
- Ne rien afficher si le modèle est à jour.
- Lancer une exception si le modèle est plus à jour que ce qui est supporté par l'application (application obsolète).
Pour celà, je dispose d'une instance de DbConnection et il est possible dans la fonction virtuelle d'ouvrir cette connexion manuellement :
Code:
1 2 3 4 5 6 7 8 9
| m_InstanceDbConnection.Open();
bool bIsTableExists;
using (DbCommand cmd = m_InstanceDbConnection.CreateCommand())
{
cmd.CommandText = @"SELECT 1 FROM sys.tables AS T INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id WHERE S.Name = 'SchemaName' AND T.Name = 'DMGeneral';";
int i = cmd.ExecuteNonQuery();
bIsTableExists = true;
} |
Bon, ce code c'est n'importe quoi, je ne sais pas comment on récupère la présence ou pas d'une table de la base de données en Oracle mais c'est un exemple de ce que l'on peut faire.
Il me faut deux choses :
- Détecter la présence (ou pas) de la table générale.
- Si la table générale existe, détecter le n° de version du schéma dans cette table.
Voilà, désolé pour ce message un peu long mais je voulais expliquer un peu le contexte de tout ça.
S'il y a des pros de Oracle et de Code First / Code First Migration qui peuvent m'aiguiller ça serait cool.
Et puis une petite requête SQL pour vérifier la présence d'une table à partir d'un DbConnection ça serait cool.
Merci à tous !