LINQ to SQL の DataContext や ADO.NET Entity Framework の ObjectContext は、引数に接続文字列を指定できます。
LINQ to SQL の場合はこんな感じ。
var sqlBuilder = new SqlConnectionStringBuilder(); sqlBuilder.InitialCatalog = "Test"; sqlBuilder.DataSource = "(local)"; sqlBuilder.IntegratedSecurity = true; using (var context = new LINQtoSQL.TestDataContext(sqlBuilder.ConnectionString)) { var customers = from c in context.Customer select c; foreach (var customer in customers) { Console.WriteLine(customer.Name); } }
ADO.NET Entity Framework の場合も、接続文字列を指定するのは同じ。
// SQL Server 接続用の接続文字列を作成 var sqlBuilder = new SqlConnectionStringBuilder(); sqlBuilder.InitialCatalog = "Test"; sqlBuilder.DataSource = "(local)"; sqlBuilder.IntegratedSecurity = true; // ADO.NET Entity Framework 向けの接続文字列を作成 var entityBuilder = new EntityConnectionStringBuilder(); entityBuilder.ProviderConnectionString = sqlBuilder.ConnectionString; entityBuilder.Provider = "System.Data.SqlClient"; entityBuilder.Metadata = "res://*/EntityFramework.Test.csdl|res://*/EntityFramework.Test.ssdl|res://*/EntityFramework.Test.msl"; // メタデータは構成ファイルから流用 using (var context = new EntityFramework.TestEntities(entityBuilder.ConnectionString)) { var customers = from c in context.Customer select c; foreach (var customer in customers) { Console.WriteLine(customer.Name); } }
LINQ to SQL より、すこし複雑。Metadata を動的に生成する方法が分らなかったので、構成ファイルに書かれている接続文字列を流用しました。
例えば「エンドユーザーの操作によって接続先データベースが切り替わるアプリケーション」の開発で、LINQ to SQL や ADO.NET Entity Framework を使いたい場合、こうやって接続文字列を渡してやるしかないな。