同一配置文件中有两个不同的提供程序

我正在使用EntityFramework 6.1.0

我有2个提供者 。 MysqlClient和SQLServerCE,我需要创建2个不同的DBContext。 这迫使我创建了2个配置类,因为mysql有一些不同的东西。 但是当我初始化应用程序时, Database.DefaultConnectionFactory来自defaultConnectionFactory(配置文件) ,并且我无法指定在daterminated Context上采用什么提供程序。

怎么做?

我的配置文件:

            

Mysql上下文:

 namespace Sistema.DataAccess { [DbConfigurationType(typeof(Sistema.DataAccess.Migrations.Configuration))] public class SistemaContext : Sistema.Common.Repository.DataContext { static SistemaContext() { Database.SetInitializer(new MigrateDatabaseToLatestVersion()); } public SistemaContext() : base(GetConnectionString()) { } private static string GetConnectionString() { return "Server=127.0.0.1;Database=?????;Uid=????;Pwd=????;Port=3306;";//MySQL } } } 

SQLCe背景:

 namespace Sistema.DataAccess { [DbConfigurationType(typeof(Sistema.DataAccess.Migrations.Configuration2))] public class SistemaContext2 : Sistema.Common.Repository.DataContext { static SistemaContext2() { Database.SetInitializer(new MigrateDatabaseToLatestVersion()); } public SistemaContext2() : base(GetConnectionString()) { } private static string GetConnectionString() { return "Data Source=C:/teste2.sdf;Persist Security Info=False;";//SQLCE } } } 

Mysql配置

  public sealed class Configuration : DbMigrationsConfiguration { public Configuration() { DbInterception.Add(new NLogCommandInterceptor());// guardar logs AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());//Mysql da erro se nao colocar isso.(Pelo que vi da para colocar no App.config tambem.) SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySQLHistoryContext(conn, schema)); } } 

SQLCE配置

 public sealed class Configuration2 : DbMigrationsConfiguration { public Configuration2() { DbInterception.Add(new NLogCommandInterceptor());// guardar logs AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; } } 

首先,您使用了错误的配置类。 DbConfigurationType需要从DbConfigurationinheritance而不是DbMigrationsConfiguration <>的类型。

DbMigrationsConfiguration实际上只用于Migrators和DatabaseInitializers。

 public class MyDbConfiguration : DbConfiguration { public MyDbConfiguration() { this.SetDefaultConnectionFactory(new System.Data.Entity.Infrastructure.SqlCeConnectionFactory("System.Data.SqlServerCe.4.0")); this.SetProviderServices("System.Data.SqlServerCe.4.0", SqlCeProviderServices.Instance); this.AddInterceptor(new NLogCommandInterceptor());// guardar logs this.SetMigrationSqlGenerator("System.Data.SqlServerCe.4.0", () => new SqlCeMigrationSqlGenerator()); } } [DbConfigurationType(typeof(MyDbConfiguration))] public class TestContext : DbContext 

遗憾的是,即使使用多个DbConfiguration,也无法设置多个DefaultConnectionFactories。

在您的情况下,您必须将连接字符串存储在app.config中,并将名称传递给DbContext构造函数。

 public class TestContext : DbContext { public TestContext() : base("name=MyConnectionString") { } 

将根据app.config中MyConnectionString的提供程序名称初始化连接

或者,如果您不希望app.config中的连接字符串将刚已初始化的DbConnection传递给DbContext构造函数

 public class TestContext : DbContext { public TestContext() : base(new SqlCeConnection(GetConnectionString()),true) { } 

或者,如果您不想初始化特定连接,请使用DbProviderFactory。

 public class TestContext : DbContext { public TestContext() : base(GetConnection(),true) { } public static DbConnection GetConnection() { var factory = DbProviderFactories.GetFactory("System.Data.SqlServerCe.4.0"); var connection = factory.CreateConnection(); connection.ConnectionString = "Data Source=C:/teste2.sdf;Persist Security Info=False;"; return connection; } 

解决! (对我而言)

我的配置文件

                 

2个上下文与问题相同。 但是我从2个上下文中删除了[DbConfigurationType(typeof(Sistema.DataAccess.Migrations.Configuration))]

配置类1(mysql)

 public sealed class Configuration : DbMigrationsConfiguration { public Configuration() { DbConfiguration.SetConfiguration(new DbConfigurationBase("MYSQL")); DbInterception.Add(new NLogCommandInterceptor());// guardar logs AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());//Mysql da erro se nao colocar isso.(Pelo que vi da para colocar no App.config tambem.) SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySQLHistoryContext(conn, schema)); } } 

配置2级(SQLCE)

 public sealed class Configuration2 : DbMigrationsConfiguration { public Configuration2() { DbConfiguration.SetConfiguration(new DbConfigurationBase("SQLCE")); DbInterception.Add(new NLogCommandInterceptor());// guardar logs AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; } } 

我使用您的DBConnection Idea来创建连接。

您需要将相应的提供程序指定为连接字符串的一部分。 我通常在配置中执行此操作,所以这样的事情: