C# 在EntityFramework for MySql中设置提供程序和连接字符串

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

我使用实体框架,在我的解决方案中有9个项目,它将扩大。我的问题是在.config文件中声明连接字符串。当我这样做时,我必须声明4-5个项目的连接字符串,当我想更改连接时,更改连接字符串成为4-5个项目的义务。我想在DbContext构造函数中设置连接字符串。DbContext可以为我提供这个功能,但我不能定义providerName。所以上下文的dbconnection自动使用SqlClient,但我想使用MySql provider。我的连接字符串是:

"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)
    {
    }        
}