2012-12-20 12 views
8

Ho un progetto di libreria F # che sto utilizzando da un progetto web C#. Vorrei utilizzare il Provider di tipo Entity Framework nel mio progetto F #, e ottenere la stringa di connessione da Web.config - ma ho problemi a farlo funzionare.Come posso fare in modo che Entity Framework Type Provider utilizzi il file di configurazione runtime?

type internal FooDb = 
    SqlEntityConnection<ConnectionStringName="FooDb", Pluralize=true> 

In fase di progettazione, che sto tenuti ad avere un file App.config nel progetto # libreria F con una stringa di connessione con il nome corrispondente.

In fase di esecuzione, quando si chiama il mio codice F # dal progetto Web C#, viene visualizzato un errore che non è in grado di individuare il file "App.config". Questo mi sorprende, perché mi aspettavo che in fase di esecuzione usasse semplicemente ConfigurationManager.ConnectionStrings per caricare la stringa di connessione dal file di configurazione attualmente attivo (nel caso di un'app Web, Web.config). Tuttavia questo non sembra essere il caso.

Ho provato ad aggiungere il parametro ConfigFile:

type internal FooDb = 
    SqlEntityConnection<ConnectionStringName="FooDb", ConfigFile="Web.config", Pluralize=true> 

Ma questo appena fatto si lamentano in fase di progettazione che non riusciva a trovare Web.config.

Quindi ho rinominato il file App.config nel progetto di libreria F # su Web.config e sembra che le cose funzionino. Tuttavia, sono a disagio per questa soluzione. È davvero così che ha intenzione di funzionare? Devo avere un file web.config nel mio progetto di libreria? Cosa farei se volessi utilizzare la stessa libreria da un eseguibile da riga di comando e in quell'ambiente il file di configurazione è chiamato AssemblyName.exe.config?

Costringendomi a codificare con hard-code il nome di un file di configurazione che può avere nomi diversi in contesti diversi sembra molto fragile e un design scarso. Per favore dimmi che mi manca qualcosa.

risposta

3

Il problema che hai riscontrato sembra davvero sfortunato, e non so se ti manca qualcosa o no. Tuttavia, il SqlEntityConnection documentation afferma che FooDb deve avere un sovraccarico GetDataContext in cui un parametro "connectionString può essere utilizzato quando la stringa di connessione viene determinata in fase di esecuzione." Forse questo ti darà un lavoro abbastanza decente (ad esempio, passa la stringa di connessione da ConfigurationManager.ConnectionStrings tu stesso).

Problemi correlati