web-dev-qa-db-fra.com

Configurer plusieurs bases de données Entity Framework 6

Dans ma solution, j'ai 2 projets qui utilisent Entity Framework 6. Chacun pointe vers une base de données différente, tous deux utilisant les mêmes données, SQL Server . Un troisième projet de ma solution doit utiliser les deux bases de données. Mon problème est de savoir comment configurer ces contextes. J'ai essayé de créer une classe de configuration dans un assembly séparé:

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

et référençant à cette configuration dans chaque classe de contexte:

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

Lors de l'initialisation de mon premier, tout fonctionne correctement, mais lorsque le second contexte s'initialise (l'ordre n'a pas d'importance), j'obtiens une erreur:

Une instance de 'EfDbConfiguration' a été définie mais ce type n'a pas été découvert dans le même assembly que le contexte 'B1Entities'. Placez le type DbConfiguration dans le même assembly que le type DbContext, utilisez DbConfigurationTypeAttribute sur le type DbContext pour spécifier le type DbConfiguration ou définissez le type DbConfiguration dans le fichier de configuration. Voir http://go.Microsoft.com/fwlink/?LinkId=260883 pour plus d'informations. *

J'ai également essayé de créer une section entityframework dans mon app.config (du projet de démarrage) mais j'ai eu l'erreur suivante:

Le système de configuration n'a pas pu s'initialiser

Section de configuration non reconnue entityFramework

Comment utiliser 2 projets EF distincts dans la même solution?

27
Motty

Peu importe le nombre de DbContexts que vous avez (Dans le framework d'entité 6) . Il suffit de mettre des chaînes de connexion dans appConfig ou webConfig du projet de démarrage.

Alors vous êtes prêt à partir.

Exemple d'appConfig avec deux connectionString avec 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>

Et exemple de DbContexts:

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

    }
}

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

    }
}

Il n'est pas important que vos contextes soient ou non dans des projets séparés, seule la configuration du projet de démarrage est importante.

Faites-moi savoir si vous avez besoin d'autres informations.

Bonne chance

24
Yaser Moradi

Bien que la question soit ancienne, j'ai été dirigée ici par Google, mais je n’ai trouvé aucune réponse… .. Peut-être que ma réponse pourrait aider quelqu'un.

La chaîne de connexion de EntityFramework 6 doit se trouver dans le fichier de configuration qui se trouve (alert!) Dans le dossier d'exécution . Par exemple, OP a plusieurs projets en solution, la chaîne de connexion doit donc figurer dans le fichier de configuration appartenant au projet exécutif principal.

Maintenant, si vous voulez définir une chaîne de connexion dans votre code, vous pouvez créer une fausse chaîne de connexion dans le fichier de configuration et donner à l'instance de votre entité une nouvelle chaîne de connexion:

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

Voici ce que j'ai fait pour deux DB avec EF6

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>

Ajouter un second constructeur dans Database.Context.tt (attention: code généré automatiquement)

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

Utilisation

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

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