Sto provando a creare una classe per eseguire il lavoro sul database e ho bisogno (o preferenza) di utilizzare una combinazione di DbContext e ADO vecchio stile. Perché, bene EF è ottimo per semplificare una grande quantità di codice, ma ADO ha ancora molti usi per metodi più complessi che EF non è ancora in grado di gestire.
Questo collegamento su MSDN afferma che posso passare un SqlConnection esistente al mio contesto come segue:
using (var conn = new SqlConnection("..."))
{
conn.Open();
using (var context = new SampleContext(conn, contextOwnsConnection: false))
{
// Do Something
}
}
Ora sto usando Database-First quindi questo costruttore non appare come standard. Ho quindi creato un nuovo file di classe parziale e creato il costruttore appropriato come segue:
public partial class MyEntities : DbContext
{
public MyEntities(System.Data.Common.DbConnection conn, bool contextOwnsConnection = false)
: base(existingConnection: conn, contextOwnsConnection: contextOwnsConnection)
{
}
}
Tuttavia, quando eseguo il codice nel momento in cui raggiunge una chiamata al nuovo costruttore DbContext, ottengo il seguente errore UnintentionalCodeFirstException () generato da OnModelCreating nel mio file EDMX:
"Il codice generato utilizzando i modelli T4 per lo sviluppo Database First e Model First potrebbe non funzionare correttamente se utilizzato in modalità Code First. Per continuare a utilizzare Database First o Model First assicurarsi che la stringa di connessione di Entity Framework sia specificata nel file di configurazione dell'applicazione in esecuzione. Per utilizzare queste classi, che sono state generate da Database First o Model First, con Code First aggiungere qualsiasi configurazione aggiuntiva utilizzando gli attributi o l'API DbModelBuilder e quindi rimuovere il codice che genera questa eccezione. "
Mi manca qualcosa di ovvio qui, o può non essere fatto con Database-First?
Chiaramente, potrei usare solo due connessioni, una per il mio oggetto SqlConnection e un'altra per il mio oggetto DbContext, ma se posso, naturalmente preferirei usare una singola connessione se possibile.
Qualsiasi aiuto è molto apprezzato. Per la divulgazione completa, sto utilizzando SQL-Server 2012, .NET 4.5.1, C # e EF6.0.2.
Le stringhe di connessione utilizzate dal progettista non sono stringhe di connessione regolari. Piuttosto sono stringhe EntityConnection
. La differenza è che le stringhe di connessione di entità contengono ulteriori informazioni su dove trovare i metadati che descrivono il modello che è in forma di edmx in fase di progettazione - leggi di più qui . Code First utilizza solo stringhe di connessione regolari poiché costruisce il modello al volo in base al codice. Quindi, UnintentionalCodeFirstException sta impedendo all'utente di utilizzare la funzionalità CodeFirst con i modelli edmx perché il modello è specificato in edmx e non nel codice e, se fosse permesso, si finirebbe in effetti usando due modelli diversi (uno da edmx e uno creato da il codice) che molto probabilmente non sarà sincronizzato e comporterebbe un comportamento strano o addirittura potrebbe portare a corruzione dei dati e crash / eccezioni. Poiché EntityConnection è derivato da DbConnection e include semplicemente una connessione regolare, è possibile utilizzarlo in luoghi in cui si utilizzerà la connessione del provider. In alternativa, è possibile accedere alla connessione del provider spostato utilizzando il provider StoreConnection in EntityConnection.