2009-08-24 3 views
6

Ho una soluzione .NET che contiene due progetti:Due progetti .NET, una stringa di connessione DB?

    progetto
  • Un ASP.NET MVC, 'Sito web'
  • una libreria di classi,

Il progetto 'modelle' 'modelli' contiene un contesto dati Linq-to-SQL insieme ad alcune classi parziali che estendono gli oggetti del database.

La stringa di connessione è definita nel web.config del progetto "Sito web".

Tuttavia, il progetto "Modelli" sembra avere il proprio app.config in cui la connessione al database è definita separatamente.

Ciò significa che se la stringa di connessione cambia, dovrò aggiornare entrambi i progetti.

Esiste un modo per centralizzare la stringa di connessione in un unico punto e utilizzare entrambi i progetti?

risposta

4

Creare una classe parziale uguale al contesto dati e utilizzare questo codice per forzare l'utilizzo della stringa web.config in contrapposizione a app.config. Metti la classe parziale nella stessa posizione del tuo modello nella libreria di classi.

public partial class YourDataContext 
{ 
    partial void OnCreated() 
    { 
     ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"]; 

     if (cs != null) 
     { 
      this.Connection.ConnectionString = cs.ConnectionString; 
     } 
    } 
} 

Vedere questa domanda per ulteriori informazioni Preferred Method for connection string in class library
RichardOD postato un link a quello che penso meglio descrive il nostro problema LINQ To SQL and the Web.Config ConnectionString Value

+0

A cosa serve il voto negativo? – Breadtruck

+2

Ma come funzionerà, dal momento che le classi parziali devono appartenere alla stessa assemblea? Voglio che l'assembly "Models" utilizzi la stringa di connessione da web.config nell'assembly "Website". – Jonathan

+0

BTW, non ho fatto downvoting. – Jonathan

1

Direi che è necessario mantenere la configurazione del prodotto nel web.config del progetto Web e quindi inserire la configurazione che si utilizza nel progetto del modello.

+0

Questo quello che faccio. Vedere la mia risposta per l'esempio di codice effettivo – Breadtruck

2

Va bene. Inserisci la stringa di connessione del modello in Web.config e dimentica (cancella) il file di configurazione del modello.

Il DataContext prende anche in una stringa di connessione nel suo costruttore, è possibile specificare in questo modo troppo (forse non in una sola riga però):

DataContext context = new DataContext(ConfigurationManager.ConnectionStrings["TheKey"].ConnectionString); 

Modifica- in base ai vostri commenti a altre risposte Sembra come se steste facendo qualcosa di sbagliato Se lo fai, il codice generato utilizzerà il valore di impostazione predefinito.

System.Configuration.DefaultSettingValueAttribute("Data Source=SERVER;Initial Catalog=XYZ;Integrated Security=True")]. 

si potrebbe essere fare l'errore di not specifying the connection string properly nel file web.config.

+0

@RichardOD: sto commentando, ma in realtà non ho fatto la domanda, anche se ho chiesto a qualcuno simile a questo un po 'di tempo fa. Non ho mai provato a cancellare il file appconfig. Lo aveva suggerito mia zia, ma nel progetto avevo anche alcuni modelli di dataset e in questo caso devi creare numerose classi di tableadapter parziali, e non avevo intenzione di farlo, quindi non ho provato a eliminare l'app. config, ma immagino che funzionerebbe. – Breadtruck

0

Ok, sto indovinando qui, ma sembra che entrambi i progetti utilizzino una stringa di connessione identica, sì?

In tal caso, specificare solo la stringa di connessione in web.config; la libreria di classi app.config non verrà comunque letta da ASP.NET.

+0

Questa non è stata la mia esperienza a meno che non avessi qualcosa di sbagliato. – Breadtruck

+0

Davvero? Stai usando un componente di terze parti che lo fa per te? Perché nella mia esperienza solo l'app.config per l'eseguibile (o nel caso di ASP.NET web.config) viene letto dal sistema per impostazione predefinita. Se c'è un app.config associato a una libreria di classi (.DLL), il contenuto di app.config deve essere A) caricato manualmente (che è ciò che i componenti di terze parti fanno per te) o B) copiato nel app.config/web.config dell'applicazione principale. – Randolpho

+0

@Randolpho: vedere http://stackoverflow.com/questions/1148559 per ulteriori chiarimenti in merito a me. – Breadtruck

0

Penso che la stringa di connessione nella libreria Modelli sia appena utilizzata dal progettista. Durante il runtime la stringa viene caricata da web.config. Quindi non è necessario che le stringhe siano sincronizzate.

+0

Questo non è quello che ho trovato dopo aver implementato una soluzione come questa in produzione. La libreria ha continuato a prelevare la propria connessione da app.config. – Breadtruck

0

Non è necessario l'app.config libreria di classi. Metti la tua configurazione su web.config. Inoltre, se hai bisogno di qualche sezione di configurazione dall'app della biblioteca.config, basta metterlo su web.config. Il ConfigurationManager leggerà da lì.

0

Se la libreria della classe Modelli fa riferimento nell'applicazione Web, è sufficiente rimuovere il riferimento nel file App.Config e assicurarsi di avere qualcosa di simile a quello inserito nel web. config. In questo modo, quando il compilatore cercherà nel web.config, troverà la stringa di connessione necessaria per il progetto MVC e quindi non avrà bisogno di guardare più in basso.

+0

Ho provato questo, ma sembra essere ottenere la stringa di connessione da un file 'Impostazioni' sotto le proprietà del progetto Modelli. C'è un codice come questo nella classe: 'global :: Models.Properties.Settings.Default.WebConnectionString, mappingSource)' – Jonathan

+0

@jonathanconroy: che è esattamente il motivo per cui la mia risposta ti aiuterà a risolvere questo problema. – Breadtruck

0

Personalmente, ho estendono DataContext nel mio Respository poi fare qualcosa di simile:

public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

In questo modo il mio repository può essere istanziato e non ho mai preoccuparsi di impostare una connessione, o di avere a che fare con esso di sorta. Per cambiare in/da database dev/live, ho appena cambiato il mio web.config.

0

L'app.config nella libreria non influisce sulla produzione: quelle stringhe di connessione sono davvero lì per il progettista linq2sql. Niente da vedere, andare avanti, questi non sono i droidi che stiamo cercando. . .