EF6 und mehrere Konfigurationen (SQL Server und SQL Server Compact)

c# configuration entity-framework entity-framework-6

Frage

Update: Problem gelöst, siehe Ende dieser Frage.

Das Problem :

Wir versuchen, Entity Framework 6 und die code-basierte Konfiguration in einem Szenario zu verwenden, in dem wir sowohl SQL Server als auch SQL Server CE in derselben AppDomain .

Dieses recht einfache Szenario scheint "von Design" nicht unterstützt zu werden. Aus dem EF-Team:

Hinweis: Wir unterstützen nicht die Verwendung mehrerer Konfigurationsklassen in derselben AppDomain. Wenn Sie dieses Attribut verwenden, um verschiedene Konfigurationsklassen für zwei Kontexte festzulegen, wird eine Ausnahme ausgelöst.

Weitere Informationen finden Sie hier: Codebasierte Konfiguration (Codeplex)

Die Frage :

Wie gehen wir von hier weiter? Jede Hilfe würde sehr geschätzt werden! Gibt es eine flexiblere Möglichkeit, eine Konfiguration mit einem Kontext anstelle einer AppDomain ?

(Unsere DbConfigurationType befinden sich in verschiedenen Assemblies. Wir haben versucht, das DbConfigurationType Attribut, aber das Problem ist EF selbst)

Konfigurationsdateien:

Konfiguration für normalen SQL Server

public class EfConfiguration : DbConfiguration
{
    public EfConfiguration()
    {
        SetProviderServices(
            SqlProviderServices.ProviderInvariantName, 
            SqlProviderServices.Instance);

        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

Konfiguration für SQL Server Compact Edition

public class EfConfiguration : DbConfiguration
{
    public EfConfiguration()
    {
        SetProviderServices(
            SqlProviderServices.ProviderInvariantName, 
            SqlProviderServices.Instance);

        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

AKTUALISIEREN:

Der Fehler, den wir bekommen, ist:

System.TypeInitializationException: Der Typinitialisierer für 'MyProject.Repositories.Base.DataContext' hat eine Ausnahme ausgelöst. ----> System.InvalidOperationException: Es wurde eine Instanz von 'EfCeConfiguration' festgelegt, aber dieser Typ wurde nicht in derselben Assembly wie der 'DataContext'-Kontext gefunden. Setzen Sie den DbConfiguration-Typ in derselben Assembly wie den DbContext-Typ, verwenden Sie DbConfigurationTypeAttribute für den DbContext-Typ, um den DbConfiguration-Typ anzugeben, oder legen Sie den DbConfiguration-Typ in der Konfigurationsdatei fest. Weitere Informationen finden Sie unter http://go.microsoft.com/fwlink/?LinkId=260883 .

UPDATE 2, die Lösung Wie oben beschrieben, können wir nur eine Konfiguration haben. Dies ist ein Problem, da Sql und SqlCe unterschiedliche Provider verwenden. Wenn wir "SetDefaultConnectionFactory" für einen Dateityp verwenden, schlägt der andere fehl.

Stellen Sie die Verbindung stattdessen in den Kontext, wie in dem als Antwort unten gekennzeichneten Beitrag beschrieben. Sobald Sie den Kontext immer mit einer Verbindung im Gegensatz zu einer Verbindungszeichenfolge initialisieren, sollten Sie fortfahren. Sie können den Aufruf von SetDefaultConnectionFactory aus der Konfiguration entfernen. Wir verwenden nur den folgenden Code zum Konfigurieren des SqlCe-Kontexts und keine Konfiguration für den Sql-Kontext.

public class EfConfiguration : DbConfiguration
{
    public EfConfiguration()
    {
        SetProviderServices(
            SqlProviderServices.ProviderInvariantName, 
            SqlProviderServices.Instance);

        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

Akzeptierte Antwort

BEARBEITEN: basierend auf Fehlerdetails: Haben Sie bereits versucht, EF mitzuteilen, wo die Konfigurationsklasse gefunden wurde?

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}

Wenn das nicht funktionieren kann, dann siehe Alternative

Verwenden Sie den Kontext mit dem Konstruktor DbConnection

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}

Sie benötigen dann für jeden Provider eine "DBConnection" -Verbindung. Für SQL Server

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}

Wiederholen für SqlCe factory, es kann auch einen DBConnection SqlCe Connection Factor erzeugen


Beliebte Antwort

Was ich getan habe:

public partial class MyDataBaseContext : DbContext
{
    public MyDataBaseContext (string ConnectionString)
        : base(ConnectionString)
    {
    }
}



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum