2011-02-08 9 views
16

Sto utilizzando Entity Framework e di recente sono venuto a realizzare i vantaggi di avere il modello EF in un altro progetto all'interno della stessa soluzione in modo che sia possibile creare più UI da esso.Spostamento del modello Entity Framework nella libreria di classi dal progetto Web

L'ho spostato in un nuovo progetto di libreria di classi e aggiornato tutti i riferimenti alle entità nel progetto Web per utilizzare la nuova dll generata dal progetto. Tutto è andato liscio, tranne che per un piccolo intoppo. Quando ho trasferito EF al nuovo progetto, in qualche modo stava ancora leggendo la sua stringa di connessione da web.config nel progetto web (non chiedermi come, perché non ne ho idea).

Ho utilizzato "Aggiorna modello dal database" nel progettista EF e non ha trovato una stringa di connessione (come mi aspettavo dopo averlo spostato nel nuovo progetto), quindi ho usato la procedura guidata per generare una nuova stringa di connessione, che è andato bene. La nuova stringa di connessione ora risiede in App.config all'interno del progetto della libreria di classi. La stringa di connessione nella finestra delle proprietà ora è corretta e il designer la sta leggendo da App.Config. Sono andato avanti e cancellato la stringa di connessione da Web.Config nel progetto web.

Ora, quando si esegue l'applicazione ottengo il seguente errore:

The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.

Se incollo la stringa di connessione di nuovo nel web.config tutto funziona bene. Non voglio creare un nuovo modello EF da zero perché è un modello abbastanza complicato e ho fatto molte ristrutturazioni dopo aver effettuato il caricamento dal DB. Ho riversato il file CS generato così come l'XML nel file edmx e non riesco a trovare nulla di utile. Ogni aiuto è molto apprezzato. Ovviamente per ora, finché non lo capisco, sto lasciando la stringa di connessione in web.config dato che, per qualsiasi ragione, sembra funzionare.

risposta

20

Questo è di progettazione; mentre il file di configurazione nella libreria di classi è ciò che verrà utilizzato dal designer, il file di configurazione dell'applicazione effettiva è che verrà utilizzato in fase di esecuzione. Che si tratti di Web.config per un progetto ASP.NET o App.config per un progetto Winforms o WPF, è il file di configurazione dell'applicazione (o qualcosa di più in alto, come Machine.config) che verrà utilizzato; il file nella libreria di classi non fa parte dell'applicazione.

Se si sta tentando di fornire un modello EF che funzioni senza dover specificare la stringa di connessione nell'applicazione o nel file di configurazione Web, sarà necessario memorizzare la stringa di connessione in un altro modo (è sempre possibile -codifica il codice) e trasferiscilo nel sovraccarico appropriato del costruttore del contesto.

La mia soluzione è generalmente quella di fornire una funzione statica senza parametri sul contesto stesso che chiama questo overload con la stringa di connessione appropriata.

+3

Aspetta, questo significa che il file app.config nella libreria di classi è inutile? Non dovrebbe la biblioteca compilata avere accesso alle proprie risorse? Come è anche a conoscenza di web.config nell'altro progetto? – Chev

+2

@Chevex: in fase di esecuzione, sì, è inutile. Il file di configurazione non è una risorsa, è solo un file di configurazione che fa parte del progetto. Costruire il progetto non fa niente. È a conoscenza di Web.config perché utilizza il gestore di configurazione di .NET e l'applicazione che viene avviata (nel tuo caso un'app Web) la indirizza lì. –

Problemi correlati