1

Je travaille actuellement sur un projet ASP.NET MVC 2 qui nécessite plusieurs instances de la même base de données SQL Server 2008 R2 (une en production en utilisant la réplication SQL, les autres étant son homologue de développement, permettant des mises à jour de schémas et des tests de nos applications localement avant la production, une instance avec la réplication SQL activée, une autre sans elle).Entity Framework & ASP.NET MVC 2: Choix d'une instance de base de données à la volée

Actuellement, nous avons besoin de trois instances de la même base de données pour effectuer nos tâches sans entraver les activités de production.

Je ne sais pas si c'est la bonne façon autour, mais la façon dont je change instance de la DB est la suivante:

  1. Aller dans le web.config, retirez le connectionString actif du DB
  2. Supprimer le Database.edmx courant
  3. Créer une nouvelle EDMX pour pointer vers l'autre base de données
  4. Ouvrez le nouveau Database.edmx avec l'éditeur XML et remplacer ceci:
    <Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
    avec ceci: <Property Name="rowguid" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Computed"/>
  5. Générez le projet de déploiement
  6. Installer la configuration soit sur notre serveur de production, ou sur notre serveur de test

Est-il possible de le faire de manière plus rapide et plus pratique ? Dans le projet, ou dans la solution de déploiement, peut-être?

Répondre

3

Oui, il existe une meilleure solution, c'est-à-dire EntityConnectionStringBuilder.

Vous avez le contrôle total sur tous les aspects de la connexion, y compris le fournisseur, le serveur/base de données, la CSDL/SSDL/MSL, sécurité, etc.

Vous pouvez ensuite attribuer dynamiquement les informations dont vous avez besoin basculée .

+0

Je vais tenter le coup et vous faire part de mes résultats, merci pour le conseil RPM1984! – LoganWolfer

+0

Il me manque du temps sur mon planning pour le configurer, pour le moment j'utilise trois .edmx et remplace à la fois la chaîne de connexion et DatabaseEntities (bon 'ol Ctrl + H) et ça fait l'affaire pour le moment. Je posterai ma solution complète quand j'aurai le temps de le faire, pour référence future. Merci. :) – LoganWolfer

+0

@LoganWolfer - c'est bien, parfois les contraintes de temps sont un problème. C'est pourquoi il est très important de démarrer un nouveau projet pour mettre en place de bonnes pratiques/fondations (comme l'injection de dépendance).Cela étant dit, peu de projets auraient votre scénario de 3 bases de données différentes pour une solution. :) – RPM1984

0

Ceci est une solution partielle ... vous pouvez remplacer la chaîne de connexion dans la méthode OnContextCreated. Donc, vous pourriez faire quelque chose comme ceci:

Private Sub OnContextCreated() 
      Dim fi As FieldInfo = GetType(ObjectContext).GetField("_connection", BindingFlags.Instance Or BindingFlags.NonPublic) 
      Dim Environment As String = "" 'pull from web.config 

      'Change the connection string based on which environment you are looking at 
      If Environment = "dev" Then 
       fi.SetValue(Me, New EntityConnection("dev connection string")) 
      ElseIf Environment = "prod" Then 
       fi.SetValue(Me, New EntityConnection("prod connection string")) 
      End If 

     End Sub 

De cette façon, vous ne devez supprimer et recréer le fichier .edmx chaque fois, étant donné que la chaîne de connexion rappelle à la base de données correcte - la seule chose que vous avoir à éditer serait la valeur rowguid, puisque cela est différent entre les deux bases de données.

Une autre chose à considérer ... vous pouvez mapper la structure d'entité create/update/delete à des procédures stockées personnalisées. Donc, si vous n'avez qu'une ou deux colonnes différentes entre les serveurs, vous pouvez avoir des process personnalisés sur chaque serveur qui traitent les différences entre les colonnes.

Questions connexes