问题
I created 2 Contexts. SQLCE context and MYSQL contexts.
public class SistemaContext : Sistema.Common.Repository.DataContext
{
static SistemaContext()
{
DbConfiguration.SetConfiguration(new DbConfigurationBase(Sistema.DataAccess.ConnectionStringFactory.DBType.MYSQL));
Database.SetInitializer(new MigrateDatabaseToLatestVersion<SistemaContext, Sistema.DataAccess.Migrations.Configuration>());
}
public SistemaContext()
: base(GetConnectionString())
{
}
private static string GetConnectionString()
{
return ConnectionStringFactory.ReturnConnectionString(ConnectionStringFactory.DBType.MYSQL);
}
...
public class SistemaContext2 : Sistema.Common.Repository.DataContext
{
static SistemaContext2()
{
DbConfiguration.SetConfiguration(new DbConfigurationBase(Sistema.DataAccess.ConnectionStringFactory.DBType.SQLCE));
Database.SetInitializer(new MigrateDatabaseToLatestVersion<SistemaContext2, Sistema.DataAccess.Migrations.Configuration2>());
}
public SistemaContext2()
: base(GetConnectionString())
{
}
private static string GetConnectionString()
{
return ConnectionStringFactory.ReturnConnectionString(ConnectionStringFactory.DBType.SQLCE);
}
...
And i created 2 Configurations for it.
public class DbConfigurationBase : DbConfiguration
{
public DbConfigurationBase(Sistema.DataAccess.ConnectionStringFactory.DBType type)
{
if (type == ConnectionStringFactory.DBType.MYSQL)
{
//<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0" />
string invariantname = MySql.Data.Entity.MySqlProviderInvariantName.ProviderName;//MySql.Data.MySqlClient
SetDefaultConnectionFactory(new MySql.Data.Entity.MySqlConnectionFactory());
//this.AddDependencyResolver(new SingletonDependencyResolver<IDbConnectionFactory>(new MySql.Data.Entity.MySqlConnectionFactory()));
SetProviderFactory(invariantname, new MySql.Data.MySqlClient.MySqlClientFactory());
SetProviderServices(invariantname, new MySql.Data.MySqlClient.MySqlProviderServices());
}
else if(type == ConnectionStringFactory.DBType.SQLCE)
{
//<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0" />
const string invariantname = "System.Data.SqlServerCe.4.0";//System.Data.SqlServerCe.4.0
SetDefaultConnectionFactory(new System.Data.Entity.Infrastructure.SqlCeConnectionFactory(invariantname));
//this.AddDependencyResolver(new SingletonDependencyResolver<IDbConnectionFactory>(new System.Data.Entity.Infrastructure.SqlCeConnectionFactory(invariantname)));
SetProviderFactory(invariantname, new System.Data.SqlServerCe.SqlCeProviderFactory());
SetProviderServices(invariantname, SqlCeProviderServices.Instance);
}
}
}
My App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="ConnMYSQL" value="EAb4YPpPv+VpS9RTnIn9TuPl2GiDxgnqWBwSJ5RH+8ANZYaXEUUKzo/shyUDUM4GQrpKxBXUC9syTTr6B2ho/Q==" />
<add key="ConnSQLCE" value="bQUToSc3LGkAI8GQGq3tmbbsGOonnbfXsV9kD1U0RT9wIHRoxHNmswPpEUhpo0dEXiJRhCwpa48o328gvX9xxw==" />
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Practices.ServiceLocation" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<entityFramework>
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient"/>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0" />
<remove invariant="System.Data.SqlServerCe.4.0" />
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>
</configuration>
But the contexts are created on the same Database Provider when i debug it. Only MYSQL, or Only SQLCE Providers on the 2 contexts.
What i do to set correctly the provider for the determinated context?
I tried AddDependencyResolver but no success.
回答1:
you need to create a connectionString for both i think.
this is copied from my app.conf file, so you will have to adapt it to fit your own. probably not only the database source, user and pass but also the right enityframework and stuff.
<connectionStrings>
<add name="configuratieEntities"
connectionString="metadata=res://*/Model.configuratie.csdl|res://*/
Model.configuratie.ssdl|res://*/Model.configuratie.msl;
provider=System.Data.SqlClient;provider connection
string="
data source=***Your database***;
initial catalog=*Your schema*;
persist security info=True;user id=***Your user***;
password=***Your password***;
multipleactiveresultsets=True;application
name=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
so you know what my provider is and you can adjust your connection string accordingly
<providers>
<provider invariantName="System.Data.SqlClient"
type="System.Data.Entity.SqlServer.SqlProviderServices,
EntityFramework.SqlServer" />
</providers>
hope this helped.
来源:https://stackoverflow.com/questions/24996931/entity-framework-6-multiple-defaultconnectionfactory