I would fulfill your requirements as follows:
First, I would add several dbml files (Linq2SQL), one for each database. You can use ADO.NET or something else if you want. You will have to name your generated data objects in different ways ... something like MySqlDataObject, OracleDataObject, FirebirdDataObject, etc.
In your user interface, you only need one set of data objects. Therefore, at your data level, you will need methods that populate each data object from different databases ... for example CopyToMySqlDataObject(ClrDataObject clrDataObject) , CopyToOracleDataObject(ClrDataObject clrDataObject) , CopyToFirebirdDataObject(ClrDataObject clrDataObject) .
Finally, I would use the DataProvider class, which refers to all of your data source objects. This class will place every action that is available and in every method will call every data source. Take a look at this example:
public int UpdateDataObject(ClrDataObject clrDataObject) { using (MySqlDataContext dataContext = new MySqlDataContext()) { MySqlDataObject mySqlDataObject = dataContext.MySqlDataObjects.Where(d => d.Id == clrDataObject.Id).FirstOrDefault(); CopyToMySqlDataObject(clrDataObject, mySqlDataObject); dataContext.SubmitChanges(ConflictMode.FailOnFirstConflict); return 0; } ... using (OracleDataContext dataContext = new OracleDataContext()) { OracleDataObject oracleDataObject = dataContext.OracleDataObjects.Where(d => d.Id == clrDataObject.Id).FirstOrDefault(); CopyToOracleDataObject(clrDataObject, oracleDataObject); dataContext.SubmitChanges(ConflictMode.FailOnFirstConflict); return 0; } }
source share