No. non esiste un unico strumento per tutto. Ma lavorandoci su poui raggiungere il risultato che vuoi.
non ti voglio tediare con concetti come il repository pattern, mef, architetture n-layer ecc... facciamo una cosa "fatta a mano" poi se vorrai approfondire, le cose verranno da se.
Progetto entità:
Per prima cosa ti serve un progetto che contiene le classi che rappresentano lo schema del tuo db. Le classi ovviamente non devono essere pari pari allo schema ma possono contenere anche proprietà calcolate e/o metodi nterni (es eta calcolata in base alla data di nascita).
codice:
public class Persona
{
//queste corrispondono ai campi della tabella persona nei db
public int ID {get;set;}
public string Nome {get;set;}
public string Cognome {get;set;}
public DateTime DataDiNascita {get;set;}
//arricchisco la classe con prop calcolate se serve
public int età { get { if(....vla bla bla.... return bla bla...} }
}
progetto dal (data access layer):
devi separare completamente la logica di accesso al db dall'implementazione del programma mettendola in un progetto separato (dal). In questo progetto ti crei una cartella (namespace) per ognuno dei db che vuoi supportare e in ognuna una classe che contiene tutti metodi di accesso al db. Questi metodi accettano parametri clr e restituiscono oggetti o collezioni di oggetti entità (quelli del progetto precedente). Internamente fanno le query al db.
Queste 4 classi oviamente avranno tutte gli stessi metodi perciò fuori dalle 4 cartelle ti crei una interfaccia che descrive questi metodi e la fai implementare alle classi.
codice:
public class MySqlDalManager : IDalManager
{
//costrittore... connesione al db....
//Inizio ad implemetare i metodi definiti nell'interfaccia...
//cerca tutte le persone che hanno un nome specificato in input
public List<Persona> ElencoPersonePerNome(string nome)
{
//implementazione in mysql
}
...
...
//magari anche un dispose...
}
programma.
Il programma, che sarà un altro progetto, utilizzerà una delle 4 classi del progetto precedente le quali espongono tutti i metodi attraverso l'interfaccia IDalMAnager. MA quale delle 4 implementazioni dovra usare? Utilizzando i late binding e la possibilità di leggere una configurazione dal file app.settings potremmo fare una cosa tipo:
codice:
public class Window1
{
//qui dichiaro la classe d accesso ai dati come interfaccia...
private IDalManager dal;
public void Initialize()
{
//...e a runtime sceglo un implementazione in base ad una variabile nel file di configurazione
//leggo da appSettings quale implementazione è configurata per questa istanza...
string implementazione = ConfigurationManager.AppSettings["dal"].ToString();
//...e la implemento (questo è il late binding)
switch (implementazione)
{
case "mySql" : dal = new MySqlDalManager();
case "oracle" : dal = new OracleDalManager();
ecc.. ecc.
}
}
}
cosi puoi usare la classe dalManager sempre allo stesso modo (è esposta solo l'interfaccia) ma solo a runtime si deciderà quale delle 4 implementazioni usare.