2013-07-01 20 views
19

Quando si deriva da DbContext e si utilizza il costruttore senza parametri, verrà caricata una stringa di connessione da web.config. Hai anche la possibilità di specificare esplicitamente connectionString usando uno degli altri costruttori di DbContext.Entity Framework: DbContext e impostazione del ProviderName

La mia situazione particolare impone che la stringa di connessione NON possa essere specificata nel web.config, in quanto la posizione del server/nome utente e password sono determinati in fase di esecuzione. Difficoltà facile, giusto? Basta usare il costruttore sopra menzionato per specificare la stringa di connessione? Sbagliato.

Il problema è che quando si specifica la stringa di connessione utilizzando detto costruttore, si tenta ancora di utilizzare il provider predefinito, quindi se si utilizza uno o più provider non standard, come sono, non funzionerà.

Sono sicuro di poter modificare il provider predefinito in web.config, ma voglio utilizzare più provider, quindi non lo farò.

L'unico modo possibile intorno a ciò che posso vedere è utilizzare ObjectContext anziché DbContext, che sembra consentire di specificare il provider insieme alla stringa di connessione al database.

C'è un altro modo per farlo? La mia soluzione è abbastanza ragionevole?

Credo di poter anche creare un DbContext da un'istanza di ObjectContext.

+1

È possibile utilizzare il costruttore che prende un 'DbConnection'. –

+0

La mia preoccupazione è che gestirò personalmente la vita di DbConnection. Inoltre, non sono del tutto sicuro di come creo DbConnection utilizzando un provider specifico. – NoPyGod

risposta

24

Crea il tuo DbConnection manualmente e passarlo al costruttore DbContext come segue:

var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection(); 
conn.ConnectionString = "MY_CONN_STR"; 

new DbContext(conn, true); 

Avviso il secondo parametro è bool contextOwnsConnectiontrue. Poiché non si riutilizza la connessione altrove, consente al contesto di gestire la connessione e Dispose() quando necessario.

0

Si può raggiungere l'ObjectContext attraverso IObjectContextAdapter:

((IObjectContextAdapter)context).ObjectContext 

DbContext ("contesto" di cui sopra) avvolge ancora ObjectContext, quindi non preoccupatevi che si avrà una nuova istanza.

È possibile creare un'istanza DbContext usando questo sovraccarico

public DbContext(ObjectContext objectContext, bool dbContextOwnsObjectContext) {} 

ad esempio:

public class YourDbContext : DbContext 
{ 
    public YourDbContext() : this(new YourObjectEntities(), dbContextOwnsObjectContext: true) 
    {} 

} 

quindi è possibile impostare la stringa di connessione all'interno di YourObjectEntities:

public partial class YourObjectEntities : ObjectContext 
{ 
    public const string ConnectionString = "name=YourEntities"; // Get it from somewhere 

    public YourObjectEntities() : base(ConnectionString, "YourEntities") 
    { 
    // Some initialization, e.g. ContextOptions.LazyLoadingEnabled = false; 
    } 
} 

Come si specifica il fornitore c'è il tuo esercizio.

-1

Prova in questo modo,

public DBDataContext _dataContex; 

public DBDataContext DBContext 
    { 
     get 
     { 
      if (_dataContex== null) 
      { 
       _v= new DBDataContext(ConfigurationManager.ConnectionStrings["yourConnectinString"].ConnectionString); 
      } 
      return _dataContex; 
     } 

    } 
+0

No, l'avevo già provato. Come ho detto, tenta di utilizzare il provider predefinito. - Ho provato di nuovo solo per essere sicuro - ProviderIncompatableException. – NoPyGod

Problemi correlati