2010-06-25 13 views
8

Al lavoro attualmente abbiamo un'applicazione web molto grande con una connessione a un enorme database. Abbiamo utilizzato Entity Framework per un po 'di tempo e per semplificare le cose abbiamo diviso il database in molti modelli Entity. Questo funziona bene per noi, ma abbiamo riscontrato un problema. Ogni modello EF ha bisogno della propria stringa di connessione a causa della parte dei metadati della stringa di connessione. Gestire così tante stringhe di connessione è un problema.Stringa di connessione singola con più modelli di framework di entità?

Ora ho una soluzione che penso funzionerà. Creerò una classe che avrà le informazioni sui metadati salvate come una proprietà anche concatenata alla stringa di connessione standard nel web.config. Quindi quando usiamo la stringa di connessione "Database.EntityConnectionString" mi darà la stringa Entity Connection ma dobbiamo solo gestire una singola stringa di connessione nel web.config. Dovremo ancora gestire la classe con i metadati, ma i modelli non cambiano molto e non li creiamo spesso, quindi la manutenzione dovrebbe andare bene. La mia domanda, c'è un modo migliore per affrontare questo problema o come lo faresti?

Grazie!

risposta

7

Ecco come ho implementato la mia soluzione a questo problema:

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"); 
      } 
     } 
    } 
} 

ho ancora bisogno di ripulire il codice e tutti, ma credo che questo vi darà una buona idea su come questo può essere implementato. Sarei ancora molto interessato se ci sono modi diversi e migliori per farlo.

Grazie!

+0

lo so che è un po 'vecchio, ma come hai fatto uso – lostmylogin

0

Ho avuto lo stesso problema. Ho risolto il problema in questo modo:

Ho creato due file edmx, ma durante la creazione del secondo file edmx, ho ignorato la stringa di connessione da salvare nel file di configurazione. In questo modo il mio file di configurazione manterrà solo una stringa di connessione. Poi ho modificato seguenti righe nella mia stringa di connessione:

<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" /> 

Basta sostituire "res: //model1.csdl" con "res: // * /" e funziona come un fascino.

È possibile specificare questo nome della connessione nel costruttore della classe DbContext come:

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

Nota: io sto usando Entity Framework 5.0.

+0

Questo non funzionerà se i modelli contengono tipi sovrapposte (ad esempio, avete la stessa tabella di riferimento in più modelli) – K0D4

+1

Bene, per questo è possibile modificare il nome di entità duplicato in Edmx stesso. Ho avuto anche la stessa tabella di riferimento in più modelli, ma rinominare il nome di entityset nella proprietà edmx entityset per evitare un'entità duplicata! – SoftSan

1

add default di costruzione nella 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; 
    } 
} 
Problemi correlati