2016-04-14 3 views
0

Ist es möglich, im selben Kontext von verschiedenen Verbindungszeichenfolgen zu laden?Ist es möglich, im selben Kontext von verschiedenen Verbindungszeichenfolgen zu laden?

Ich habe 4 identische Datenbanken. Identisch in der Struktur, aber jeder von ihnen enthält spezifische Daten. Ich habe auf Kontext.

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(); 

aber in meiner config-Datei habe ich diese

<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" /> 

Und ich erhalte eine Ausnahme, weil Entity Framework mir sagen, es nicht die Verbindungszeichenfolge für DbContext findet.

Es scheint EF laden standardmäßig eine Verbindungszeichenfolge mit seinem Klassennamen. Richtig? Wie kann ich andere Verbindungszeichenfolgen laden?

+0

Welche Version von EntityFramework verwenden Sie? Verwenden Sie T4-Vorlagen, um Ihren DbContext-Code zu generieren? –

+0

EntityFramework 6 und ich verwende T4-Vorlagen, um meinen DbContext zu generieren. –

Antwort

1

Die DbContext verfügt über eine Überladung, mit der Sie die Verbindungszeichenfolge oder den zu verwendenden Verbindungszeichenfolgennamen angeben können.

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) 
    { 
    } 
} 

Wenn Ihr Kontext nicht diese Überladung hat, werden Sie Ihre T4-Vorlage aktualisieren müssen, um es hinzuzufügen. Suchen Sie diesen Teil in Ihrer Vorlage:

<#=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 
} 

Dann ändern Sie es, um die Überlast Ihre Notwendigkeit hinzuzufügen.

<#=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 
} 

Damit sollten Sie Ihren Kontext Wich-Datenbank verbinden sagen können.

+0

Danke. Weißt du, warum sie (der Ersteller der Standardvorlage) dies nicht standardmäßig hinzugefügt haben? Ist es möglich, eine bessere/aktualisierte Vorlage zu finden? –

+0

Ich weiß nicht, warum tut mir leid. Ich denke, es ist das Standardverhalten des Gerüstbauers aus dem EntityFramework-Paket. –

Verwandte Themen