C# 在EntityFramework for MySql中设置提供程序和连接字符串
我使用实体框架,在我的解决方案中有9个项目,它将扩大。我的问题是在.config文件中声明连接字符串。当我这样做时,我必须声明4-5个项目的连接字符串,当我想更改连接时,更改连接字符串成为4-5个项目的义务。我想在DbContext构造函数中设置连接字符串。DbContext可以为我提供这个功能,但我不能定义providerName。所以上下文的dbconnection自动使用SqlClient,但我想使用MySql provider。我的连接字符串是:C# 在EntityFramework for MySql中设置提供程序和连接字符串,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我使用实体框架,在我的解决方案中有9个项目,它将扩大。我的问题是在.config文件中声明连接字符串。当我这样做时,我必须声明4-5个项目的连接字符串,当我想更改连接时,更改连接字符串成为4-5个项目的义务。我想在DbContext构造函数中设置连接字符串。DbContext可以为我提供这个功能,但我不能定义providerName。所以上下文的dbconnection自动使用SqlClient,但我想使用MySql provider。我的连接字符串是: "Server=localhost;Da
"Server=localhost;Database=xxx;Uid=auth_windows;Persist Security Info=True;User=root;Password=yyyyyy;"
此外,我不能在连接字符串中指定提供者名称,如“provider=MySql.Data.MySqlClient”。它抛出异常“不支持提供程序关键字”
我把我的问题改成更容易理解的问题
简言之,我想谈谈这个问题
public class XxContext : DbContext
{
public XxContext()
{
this.Database.Connection.Provider = "MySql.Data.MySqlClient";
this.Database.Connection.ConnectionString = "Server=localhost bla bla bla";
}
}
但是我不知道如何声明应该使用MySql.Data.MySqlClient(不带配置文件)。可能吗?如果是,我该怎么办?你的是一个。由于这些对象仅支持SQL Server,因此不能使用提供程序
关键字。此外,由于您使用的是EF,因此需要指定不同的连接字符串,以便使用数据库的模型、上下文和提供者
关键字。一个典型的例子是:
<connectionStrings>
<add name="AdventureWorksEntities"
connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl;
provider=System.Data.SqlClient;provider connection string='Data Source=localhost;
Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=60;
multipleactiveresultsets=true'" providerName="System.Data.EntityClient" />
</connectionStrings>
您还需要将这些文件复制到它们所在的位置
可在构建期间访问项目,例如bin
目录
接下来,您需要向Web.config(或App.config,如果需要)添加一些项目
基于桌面的)文件
连接字符串:
还可以选择在和节点内添加提供程序(这是本教程第二部分中绝对必需的)
我的回答是,在处理动态定义的数据库时)您可以
更改节点:
如果从默认sql server更改defaultConnectionFactory
连接时,不要忘记删除
嵌套在defaultConnectionFactory节点中。这个
MysqlConnectionFactory不为其
构造函数,如果参数仍然存在,则将失败
您可以使用在配置文件中注册的
DbProviderFacory
(请参阅和)
您的配置文件应该有如下内容
<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.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
IDbContextFactory
public class MyDbContextFactory
: IDbContextFactory<MyDbContext>
{
private readonly string _connectionStringName;
public MyDbContextFactory(string connectionStringName)
{
Contract.Requires<NullReferenceException>(
!string.IsNullOrEmpty(connectionStringName),
"connectionStringName");
_connectionStringName = connectionStringName;
}
public MyDbContext Create()
{
var connectionStringSettings = ConfigurationManager
.ConnectionStrings[_connectionStringName];
var connection = DbProviderFactories
.GetFactory(connectionStringSettings.ProviderName)
.CreateConnection();
if (connection == null)
{
var message = string.Format(
"Provider '{0}' could not be used",
connectionStringSettings.ProviderName);
throw new NullReferenceException(message);
}
connection.ConnectionString = connectionStringSettings
.ConnectionString;
return new MyDbContext(connection, true);
}
}
公共类MyDbContextFactory
:IDbContextFactory
{
私有只读字符串_connectionString名称;
公共MyDbContextFactory(字符串连接字符串名称)
{
合同。需要(
!string.IsNullOrEmpty(connectionStringName),
“连接字符串名称”);
_connectionStringName=connectionStringName;
}
公共MyDbContext创建()
{
var connectionStringSettings=ConfigurationManager
.ConnectionStrings[_connectionStringName];
var connection=dbProviderFactorys
.GetFactory(connectionStringSettings.ProviderName)
.CreateConnection();
if(连接==null)
{
var message=string.Format(
“无法使用提供程序{0}”,
connectionStringSettings.ProviderName);
抛出新的NullReferenceException(消息);
}
connection.ConnectionString=ConnectionString设置
.连接字符串;
返回新的MyDbContext(connection,true);
}
}
与上下文构造函数的连接能够以编程方式包含
DbProvider
。上下文被设置为拥有连接,以便它可以在第一次使用时打开,在处置时关闭。有几种方法可以设置提供程序,但我认为最简单的一种方法是向DbContext类添加属性。然后将完整连接字符串传递给其构造函数。构造一个MySqlConnection对象并将其传递给DbContext构造函数。参见下面的EF6示例代码
[DbConfigurationType(typeof(MySqlEFConfiguration))]
class OrderDb : DbContext
{
public virtual DbSet<Order> Orders { get; set; }
public OrderDb(string conStr): base(new MySqlConnection(conStr), true)
{
}
}
[DbConfigurationType(typeof(MySqlEFConfiguration))]
类OrderDb:DbContext
{
公共虚拟数据库集命令{get;set;}
public OrderDb(string conStr):base(新的MySqlConnection(conStr),true)
{
}
}
那么您想在代码或配置中更改提供程序?我想在代码中更改
<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.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
public class MyDbContext
: DbContext
{
public MyDbContext(DbConnection connection, bool contextOwnsConnection)
: base(connection, contextOwnsConnection)
{
}
}
public class MyDbContextFactory
: IDbContextFactory<MyDbContext>
{
private readonly string _connectionStringName;
public MyDbContextFactory(string connectionStringName)
{
Contract.Requires<NullReferenceException>(
!string.IsNullOrEmpty(connectionStringName),
"connectionStringName");
_connectionStringName = connectionStringName;
}
public MyDbContext Create()
{
var connectionStringSettings = ConfigurationManager
.ConnectionStrings[_connectionStringName];
var connection = DbProviderFactories
.GetFactory(connectionStringSettings.ProviderName)
.CreateConnection();
if (connection == null)
{
var message = string.Format(
"Provider '{0}' could not be used",
connectionStringSettings.ProviderName);
throw new NullReferenceException(message);
}
connection.ConnectionString = connectionStringSettings
.ConnectionString;
return new MyDbContext(connection, true);
}
}
[DbConfigurationType(typeof(MySqlEFConfiguration))]
class OrderDb : DbContext
{
public virtual DbSet<Order> Orders { get; set; }
public OrderDb(string conStr): base(new MySqlConnection(conStr), true)
{
}
}