2016-04-14 10 views
0

differents接続文字列から同じコンテキストで読み込むことはできますか?differents接続文字列から同じコンテキストで読み込むことはできますか?

私は同じデータベースを4つ持っています。構造は同じですが、それぞれに固有のデータが含まれています。私は文脈の上にある。

Namespace.Data.dbContext dbContext_1 = new Namespace.Data.dbContext(); 
Namespace.Data.dbContext dbContext_2 = new Namespace.Data.dbContext(); 
Namespace.Data.dbContext dbContext_3 = new Namespace.Data.dbContext(); 
Namespace.Data.dbContext dbContext_4 = new Namespace.Data.dbContext(); 

が、私の設定ファイルに私はこの

<add name="dbContext_1" connectionString="..." providerName="System.Data.EntityClient" /> 
<add name="dbContext_2" connectionString="..." providerName="System.Data.EntityClient" /> 
<add name="dbContext_3" connectionString="..." providerName="System.Data.EntityClient" /> 
<add name="dbContext_4" connectionString="..." providerName="System.Data.EntityClient" /> 

を持っており、Entity Frameworkのは、それがdbContextの接続文字列を見つけることができません教えてくださいので、私は例外を取得。

デフォルトではEFはクラス名の接続文字列を読み込んでいるようです。正しい?他の接続文字列をロードするにはどうしたらいいですか?

+0

どのようなEntityFrameworkのバージョンを使用していますか? T4テンプレートを使用してDbContextコードを生成していますか? –

+0

EntityFramework 6と私はT4テンプレートを使用してDbContextを生成します。 –

答えて

1

DbContextには、使用する接続文字列または接続文字列名を指定できるオーバーロードがあります。

public class YourContext : DbContext 
{ 
    // You can pass either dbContext_1, dbContext_2, dbContext_3, dbContext_4 as connection string name 
    public YourContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) 
    { 
    } 
} 

あなたのコンテキストは、この過負荷を持っていない場合、あなたはそれを追加するにはT4テンプレートを更新する必要があります。テンプレートでこの部分を探します。

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext 
{   
    // This will generate the default constructor  
    public <#=code.Escape(container)#>() 
     : base("name=<#=container.Name#>") 
    { 
<# 
if (!loader.IsLazyLoadingEnabled(container)) 
{ 
#> 
     this.Configuration.LazyLoadingEnabled = false; 
<# 
} 
#> 
    } 

    // Removed this part for readability 
} 

次に、必要に応じてオーバーロードを追加します。

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext 
{   
    // This will generate the default constructor  
    public <#=code.Escape(container)#>() 
     : this("name=<#=container.Name#>") 
    { 
    } 

    // This is the overload you need 
    public <#=code.Escape(container)#>(string nameOrConnectionString) 
     : base(nameOrConnectionString) 
    { 
<# 
if (!loader.IsLazyLoadingEnabled(container)) 
{ 
#> 
     this.Configuration.LazyLoadingEnabled = false; 
<# 
} 
#> 
    } 

    // Removed this part for readability 
} 

これで、接続するデータベースがわかるはずです。

+0

ありがとうございます。なぜ彼ら(デフォルトテンプレートの作成者)がこれをデフォルトで追加しなかったのか分かりますか?より良い/更新されたテンプレートを見つけることは可能ですか? –

+0

私はなぜ残念なのかわかりません。私はそれがEntityFrameworkパッケージからの足場のデフォルト動作だと思います。 –

関連する問題