LINQ to SQL や ADO.NET Entity Framework で接続先データベースを動的に決定する

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 SQLADO.NET Entity Framework を使いたい場合、こうやって接続文字列を渡してやるしかないな。