2015-02-09 11 views
5

Ho il seguente problema. Sto utilizzando Entity Framework 6 e voglio essere in grado di modificare il database utilizzato su runtime o almeno voglio essere in grado di controllare le informazioni di connessione quando inserito nelle Opzioni. Il mio problema è che vogliamo supportare MySql e LocalDB v12.0 in modo semplice, lo scambio delle stringhe di connessioni non aiuta qui - Devo scambiare ExecutionStrategy e ConnectionFactory.EntityFramwork, utilizzando più database/connessioni

EF sembra bloccare tutte le configurazioni quindi non sono in grado di cambiarlo in runtime, c'è un workarround per questo? Per il momento ho provato a creare diverse DbConfigurations e ricavare un contesto per ogni configurazione con una definizione di [DbConfigurationType(typeof(LocalDbConfigruation))].

Mi aspettavo questo a fallire, ma ho thougt sarebbe la pena di provare;)

Forse c'è qualcuno là fuori che mi può aiutare con alcuni Tipps e trucchi.

risposta

0

Ok, il problema sembra essere risolto ora. Sto lavorando con DbConnections ora.

public MyContext() : base(ConnectionManager.Connection, true) 
{ 
    Database.SetInitializer<MyContext>(new MyContextInitializer()); 
    Configuration.ProxyCreationEnabled = false; 
} 

public MyContext(DbConnection connection) : base(connection, true) 
{ 
    Database.SetInitializer<MyContext>(new MyContextInitializer()); 
    Configuration.ProxyCreationEnabled = false; 
} 

ho creare il DbConnection in una classe speciale, penso che non sarebbe opportuno pubblicare il codice qui. Ma lo fa in fondo qualcosa di simile:

DbConnection conn = null; 

switch (Type) 
{ 
    case ConnectionType.LocalDB: 
     conn = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection(); 
     break; 
    case ConnectionType.MySql: 
     conn = DbProviderFactories.GetFactory("MySql.Data.MySqlClient").CreateConnection(); 
     break; 
    default: 
     throw new System.InvalidOperationException(); 
} 

conn.ConnectionString = "Add provider specific connection string here"; 

Poi basta dare il codice somhow al contesto. Nel mio caso ho un ConnectionManager da cui leggo la "connessione defaul" quando chiamo MyContext() e c'è un secondo Ctor che io chiamo per "test connections".

1

C'è un'altra opzione che utilizza un contesto di base. Nell'esempio seguente sto usando la connessione MSSQL e la connessione Oracle. È possibile estendere il contesto di base per molti tipi di connessione al database che si desidera. Questo metodo apre un sacco di altre grandi possibilità, ma dovrebbe funzionare anche per la tua situazione.

BaseContext.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    public class BaseContext<TContext> : DbContext where TContext : DbContext 
    { 
     static BaseContext() 
     { 
      Database.SetInitializer<TContext>(null); 
     } 

     public BaseContext(string connectionString = "Name=MSSQLEntities") 
      : base(connectionString) 
     {} 
    } 
} 

MSSQLModel.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    // Extending Base Context will use default MSSQLEntities connection 
    public class MSSQLContext : BaseContext<MSSQLContext> 
    { 
     ...apply DbSet<> and other loveliness...   
    } 
} 

OracleModel.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    // Extending Base Context 
    public class OracleContext : BaseContext<OracleContext> 
    { 
     // Declare Oracle connection in Constructor to override default 
     // MSSQL connection 
     public OracleContext() 
      : base("Name=OracleEntities") 
     { } 
     ...apply DbSet<> and other loveliness...   
    } 
} 
+0

Grazie, io considero usando il vostro soluition, sembra abbastanza bello :) – SirBirne

Problemi correlati