wake-up-neo.com

Konfigurieren von Entity Framework für mehrere Datenbanken 6

In meiner Lösung habe ich 2 Projekte, die Entity Framework 6 verwenden. Jeder verweist auf eine andere Datenbank, die beide die gleichen Daten bereitstellen - SQL Server . Ein drittes Projekt in meiner Lösung muss beide Datenbanken verwenden. Mein Problem ist, wie man diesen Kontext konfiguriert. Ich habe versucht, eine Konfigurationsklasse in einer separaten Assembly zu erstellen:

namespace OSAD_Base
{
    class EfDbConfiguration : DbConfiguration
    {
        public EfDbConfiguration()
        {
            SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
        }
    }
}

und Verweisen auf diese Konfiguration in jeder Kontextklasse:

namespace IntegrationDb
{
    [DbConfigurationType("OSAD_Base.EfDbConfiguration, OSAD_Base")]
    public partial class IntegrationEntities : DbContext
    {
        public IntegrationEntities(string connectionString)
            : base(connectionString)
        {
        }
    }
}

Wenn ich mein erstes initialisiere, funktioniert alles korrekt, aber wenn der zweite Kontext initialisiert wird (Reihenfolge spielt keine Rolle), bekomme ich eine Fehlermeldung:

Eine Instanz von 'EfDbConfiguration' wurde festgelegt, aber dieser Typ wurde nicht in derselben Assembly wie der 'B1Entities'-Kontext gefunden. Fügen Sie den DbConfiguration-Typ in dieselbe Assembly wie den DbContext-Typ ein, 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 . *

Ich habe auch versucht, einen Entityframework-Abschnitt in meiner app.config (des Startprojekts) zu erstellen, bekam jedoch folgende Fehlermeldung:

Konfigurationssystem konnte nicht initialisiert werden

Unbekannter Konfigurationsabschnitt entityFramework

Wie kann ich zwei separate EF-Projekte in derselben Lösung verwenden?

27
Motty

Es ist nicht wichtig, wie viele DbContexts Sie haben (In Entity Framework 6) ..__ Fügen Sie die Verbindungszeichenfolgen in appConfig oder webConfig des Startprojekts ein.

Dann bist du bereit zu gehen.

Beispiel für appConfig mit zwei Verbindungszeichenfolgen mit Ef 6.01 & Sql Compact 4.0

<configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="MainDb" connectionString="Data Source=|DataDirectory|\Db.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="AnotherDb" connectionString="Data Source=|DataDirectory|\AnotherDb.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
    </providers>
  </entityFramework>

Und ein Beispiel für DbContexts:

public class AppDb : DbContext
{
    public AppDb()
        : base("MainDb")
    {

    }
}

public class AnotherDb : DbContext
{
    public AnotherDb()
        : base("AnotherDb")
    {

    }
}

Es ist nicht wichtig, dass sich Ihre Kontexte in separaten Projekten befinden oder nicht. Nur die Konfiguration des Startprojekts ist wichtig.

Lassen Sie mich wissen, ob Sie weitere Informationen benötigen.

Viel Glück

24
Yaser Moradi

Obwohl die Frage alt ist, wurde ich von google hierher verwiesen, fand aber keine Antwort ... __ Vielleicht hilft meine Antwort jemandem.

Die Verbindungszeichenfolge von EntityFramework 6 sollte sich in der Konfigurationsdatei befinden, die sich im Ausführungsordner (Alert!) Befand . Zum Beispiel hat OP mehrere Projekte in Lösung, daher muss sich die Verbindungszeichenfolge in der Konfigurationsdatei befinden, die zum Hauptprojekt gehört.

Wenn Sie nun die Verbindungszeichenfolge in Ihrem Code definieren möchten, können Sie in der Konfigurationsdatei eine falsche Verbindungszeichenfolge erstellen und der Instanz Ihrer Entität eine neue Verbindungszeichenfolge zuweisen:

DBEntities e = new DBEntities();
e.Database.Connection.ConnectionString = "Data Source=MyServ;Initial Catalog=MyDB;Persist Security Info=True;User ID=sa;Password=***;Application Name=MyApp";
9
Rodion

Folgendes habe ich für zwei DB mit EF6 gemacht

Web.config

      <connectionStrings>
        <add name="EntityContainer" connectionString="metadata=res://WebService/Database.Database.csdl|res://WebService/Database.Database.ssdl|res://WebService/Database.Database.msl; .../>
        <add name="ArchiveEntityContainer" connectionString="metadata=res://WebService/Database.Database.csdl|res://WebService/Database.Database.ssdl|res://WebService/Database.Database.msl; .../>
      </connectionStrings>

Hinzufügen eines zweiten Konstruktors in Database.Context.tt (Achtung: automatisch generierter Code)

public <#=code.Escape(container)#>(string connectionString)
    : base(connectionString)
{
}

Benutzen

using (EntityContainer context = new EntityContainer())
{
    //...
}

using (EntityContainer context = new EntityContainer("ArchiveEntityContainer"))
{
    //...
}
0
Flou