以前、LINQ to SQL や ADO.NET Entity Framework で、接続するデータベースを動的に変更する方法を紹介しました。
仕事では仕様上、動的に接続先データベースを変更することが結構多くて、毎回こんなコードは書いていられないです。この方法を実際に使う場合、ファクトリクラスを作ることになると思います。下記は LINQ to SQL の例。
public static class DataContextFactory<T> where T : DataContext { /// <summary> /// DataContext を生成します。 /// </summary> /// <typeparam name="T">データコンテキストの型</typeparam> /// <param name="server">SQL Server インスタンス名</param> /// <param name="database">データベース名</param> /// <param name="windows">Windows 認証のとき true。SQL 認証のとき false。</param> /// <param name="name">SQL 認証時のユーザー名</param> /// <param name="password">SQL 認証時のパスワード</param> /// <returns>データコンテキスト</returns> public static T CreateDataContext(string server, string database, bool windows = true, string name = null, string password = null) { // 接続文字列を作成 var builder = new SqlConnectionStringBuilder(); builder.DataSource = server; builder.InitialCatalog = database; builder.IntegratedSecurity = windows; if (!windows) { builder.UserID = name; builder.Password = password; } // new() だと接続文字列を引数で渡せないので、 // Activator を使って DataContext を生成 return (T)Activator.CreateInstance(typeof(T), builder.ToString()); } }
ADO.NET Entity Framework の場合は、メタデータが必要になるので、同じようにはいかないです。多分、接続文字列を構成ファイルから読み込んで、インスタンス名やデータベース名を置換することになるんじゃないかな。試してないですけど。