読者です 読者をやめる 読者になる 読者になる

WCF Data Services で動的に接続データベースを切り替える方法

.net
            j: :/: :_ ,;、、;,;,__:!: : : : :
         / r'/;;:='ヘk¬-、__`: : : : :
        _,イ (/='゛_r斤:|「`ヾァー-`ニ   DataServiceは動的にデータベースを指定出来ない
        「:|;ゞ-|:::::i:::::{リ::||_,ノ'″だが・・・DataSourceの生成処理を変更することは出来る
        |::l欠"lヽl::::::テ〃゛;   それが人類に残された最後の手段なんだ
        /: : :l ゞ--‐'^"´
     ,、‐'´: : : : : l 
    〈  ̄` ー-¬:卜、          ,.:':
    ``丶, ̄` '^`ヽ        ,:':
       | _           /
       ヽャ‐‐-__、、  ヽ
        ,〕!ニ、=-'’   |
         L、
          _,,、 _ 、
        /|   / /  ` ー 、
      _rイ  i|  l !/  _, イ´` ┐
      ノ_,,.、 、| { i|  イ'´  _ニ二ス
     ノ _ \ヽ { i} /Z _∠r√¨`ハ
     厂 _ソ´`` ヾハノ/-‐'´   ヾ=弌
    ン_,イ!    イ|{ヽ     r/二ニ〉
     ヾ、j _ __」{ ノ _,,,,、、_! 〉孑/
      {ヽ'"フュッキ< `^、''エi'ヽ-,ハr‐}
        lrハ   '′{   ``    j彳ソ
      ヾハ、   r'}  > 、 /ノミj/
        `ヘ} /_ `ー' __,ヽ /|`´
         _|ヾ  ̄、、  ゙/ | 、
        i(人ヘ       /-‐'ノ |
       ノ \ 'ー--‐ ', - '′ ヽ、CreateDataSourceをoverrideとは大げさすぎるな・・・
     _//    `ヽ、/´       > 、_
  _/´   ヽ、    |     _,、‐'´   `\_まさかここで構築する気か!? 接続文字列を!!!
public class TestDataService : DataService<TestEntities>
{
    public static void InitializeService(IDataServiceConfiguration config)
    {
        // 全部許可する。
        config.SetEntitySetAccessRule(typeof(user).Name, EntitySetRights.All);
    }

    private static int count = 0;

    // CreateDataSource をオーバーライドすれば、
    // DataService が接続するデータベースを変更することもできる。
    protected override TestEntities CreateDataSource()
    {
        // SQL Server の接続文字列を作成する。
        // 動的に接続先データベースを切り替えてみる。
        var sqlBuilder = new SqlConnectionStringBuilder();
        sqlBuilder.DataSource = "(local)";
        sqlBuilder.IntegratedSecurity = true;
        if ((count++ % 2) == 0)
        {
            sqlBuilder.InitialCatalog = "Test";
        }
        else
        {
            sqlBuilder.InitialCatalog = "Test2";
        }

        // Entity Framework で使う接続文字列を作成する。
        // Metadata は TestEntities をツールで生成したときのものを流用。
        var entityBuilder = new EntityConnectionStringBuilder();
        entityBuilder.Provider = "System.Data.SqlClient";
        entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
        entityBuilder.Metadata = "res://*/Test.csdl|res://*/Test.ssdl|res://*/Test.msl";

        return new TestEntities(entityBuilder.ToString());
    }
}
            _    
      _,,......,、._  /,_:::::\  
   _,,.i'_-    \  \::::\
  ,/::::::::7i !l/    `i.  \::7
  |;;;;;;;;;;/,i/| ,'^ i   _,> //  <未だに Metadata が動的に作れない・・・
   >,ハri_'、__`トーl::::::::::ト, '/
     ゙トー,---'::::,,,,::/ 7||
     ヽ::::i'::::::::r''=ー、'/ || 
      >;::\:::::ヽ ,/\||
     'i_゙,ノ _>:::::>/
        〈_,>ア"]