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

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

Das Problem:

Wir versuchen, Entity Framework 6 und die codebasierte Konfiguration in einem Szenario zu verwenden, in dem sowohl SQL Server als auch SQL Server CE verwendet werdenAppDomain.

Dieses recht einfache Szenario scheint "vom Design her" nicht unterstützt zu werden. Vom EF-Team:

Hinweis: Es wird nicht unterstützt, dass mehrere Konfigurationsklassen in derselben AppDomain verwendet werden. Wenn Sie dieses Attribut verwenden, um unterschiedliche Konfigurationsklassen für zwei Kontexte festzulegen, wird eine Ausnahme ausgelöst.

Weitere Informationen hier:Codebasierte Konfiguration (Codeplex)

Die Frage:

Wie kommen wir von hier aus voran? Jede Hilfe wäre sehr dankbar! Gibt es eine flexiblere Möglichkeit, eine Konfiguration mit einem Kontext anstatt mit einem zu verbinden?AppDomain?

(Unsere Kontextklassen befinden sich in verschiedenen Assemblys. Wir haben das ausprobiertDbConfigurationType 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 EfCeConfiguration : DbConfiguration
{
    public EfCeConfiguration()
    {
        SetProviderServices(
            SqlCeProviderServices.ProviderInvariantName,
            SqlCeProviderServices.Instance);

        SetDefaultConnectionFactory(
            new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName));
    }
}

AKTUALISIEREN:

Der Fehler, den wir bekommen, ist:

System.TypeInitializationException: Der Typinitialisierer für 'MyProject.Repositories.Base.DataContext' hat eine Ausnahme ausgelöst. ----> System.InvalidOperationException: Eine Instanz von 'EfCeConfiguration' wurde festgelegt, dieser Typ wurde jedoch nicht in derselben Assembly wie der Kontext 'DataContext' erkannt. Setzen Sie den DbConfiguration-Typ entweder in dieselbe 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. Sehenhttp://go.microsoft.com/fwlink/?LinkId=260883 für mehr Informationen.

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

Geben Sie stattdessen die Verbindung in den Kontext ein, wie in dem Beitrag beschrieben, der als Antwort unten markiert ist. Sobald Sie den Kontext immer mit einer Verbindung im Gegensatz zu einer Verbindungszeichenfolge initialisieren, können Sie loslegen. Sie können den SetDefaultConnectionFactory-Aufruf 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 CommonEfConfiguration : DbConfiguration
    {
        public CommonEfConfiguration()
        {
            // EF does not know if the ce provider by default,
            // therefore it is required to be informed about it.
            // The connection factories are not necessary since the connection
            // is always created in the UnitOfWork classes
            SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance);
        }
    }

Antworten auf die Frage(3)

Ihre Antwort auf die Frage