2010-06-25 10 views
8

Au travail, nous avons actuellement une très grande application Web avec une connexion à une base de données massive. Nous utilisons Entity Framework depuis un moment et pour faciliter les choses, nous avons divisé la base de données en plusieurs modèles Entity. Cela fonctionne bien pour nous, mais nous avons rencontré un problème. Chaque modèle EF a besoin de sa propre chaîne de connexion en raison de la partie métadonnées de la chaîne de connexion. Gérer autant de chaînes de connexion est une douleur.Chaîne de connexion unique avec modèles de structure à plusieurs entités?

Maintenant, j'ai une solution qui, je pense, va fonctionner. Je vais créer une classe qui aura les informations de métadonnées enregistrées en tant que propriété également concaténées à la chaîne de connexion standard dans le fichier web.config. Donc, lorsque nous utilisons la chaîne de connexion "Database.EntityConnectionString", cela me donnera la chaîne Entity Connection mais nous n'avons qu'à gérer une seule chaîne de connexion dans le fichier web.config. Nous devrons encore gérer la classe avec les métadonnées, mais les modèles ne changent pas beaucoup et nous ne les créons pas souvent, donc la maintenance devrait être bonne. Ma question est la suivante: y a-t-il une meilleure façon de régler ce problème ou comment le feriez-vous?

Merci!

Répondre

7

Voilà comment j'ai mis ma solution à ce problème:

namespace DBLibrary 
{ 
    public enum Models 
    { 
     Model1, 
     Model2  
    } 

    public static class Database 
    { 
     public static string EntitiesConnectionString(Models model) 
     { 
      SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["Default"].ConnectionString); 

      builder["MultipleActiveResultSets"] = true; 
      builder["Connect Timeout"] = 30; 

      EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
      entityBuilder.Provider = "System.Data.SqlClient"; 
      entityBuilder.ProviderConnectionString = builder.ConnectionString; 

      switch (model) 
      { 
       case Models.Model1: 
        entityBuilder.Metadata = "res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl"; 
        return entityBuilder.ToString(); 
       case Models.Model2: 
        entityBuilder.Metadata = "res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl"; 
        return entityBuilder.ToString(); 
       default: 
        throw new Exception("Invalid model, no connection string defined"); 
      } 
     } 
    } 
} 

Je dois encore nettoyer le code et tout, mais je pense que cela vous donne une bonne idée sur la façon dont cela peut être mis en œuvre. Je serais toujours très intéressé s'il y a des façons différentes et meilleures de le faire.

Merci!

+0

Je sais qu'il est un peu vieux, mais comment avez-vous utilisé – lostmylogin

0

J'ai eu le même problème. Je l'ai résolu de la façon suivante:

J'ai créé deux fichiers edmx, mais lors de la création du second fichier edmx, j'ai ignoré la chaîne de connexion à enregistrer dans le fichier de configuration. De cette façon, mon fichier de configuration ne contiendra qu'une seule chaîne de connexion. Alors je modifié les lignes suivantes dans ma chaîne de connexion:

<add name="MyDbContext" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

Il suffit de remplacer "res: //model1.csdl" avec "res: // * /" et il fonctionne comme un charme.

Vous pouvez spécifier ce nom de connexion dans le constructeur de votre classe dbcontext comme:

public MyDbContext() : base("name=NameOfYourConnectionString") // Name of your connection string 
{ } 

Note: J'utilise Entity Framework 5.0.

+0

Cela ne fonctionnera pas si vos modèles contiennent des types qui se chevauchent (c.-à-vous la même table référencée dans plusieurs modèles) – K0D4

+1

Eh bien, pour cela, vous pouvez changer le nom de l'entité en double dans Edmx lui-même. J'avais aussi la même table référencée dans le modèle multiple, mais je renomme le nom de l'entité en entité edmx entityset pour éviter l'entité en double! – SoftSan

1

Ajouter Construction par défaut dans votre classe

public class ItemContext : DbContext 
{ 
    public DbSet<Item>Items get; set; } 
    public DbSet<ItemDetail> ItemDetails { get; set; } 

    public ItemContext() 
    { 

     this.Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
    } 
}