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

arn*_*nes 6 c# mysql entity-framework

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

"Server=localhost;Database=xxx;Uid=auth_windows;Persist Security Info=True;User=root;Password=yyyyyy;"
Run Code Online (Sandbox Code Playgroud)

此外,我无法在连接字符串中指定提供程序名称,如"Provider = MySql.Data.MySqlClient".它抛出异常"不支持Provider关键字".

我正在改变我的问题,以便更容易理解.

总之我想要这个.

public class XxContext : DbContext
{

       public XxContext()
       {

            this.Database.Connection.Provider = "MySql.Data.MySqlClient";
            this.Database.Connection.ConnectionString = "Server=localhost bla bla bla";

       }
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何声明你应该使用MySql.Data.MySqlClient(没有配置文件).可能吗 ?如果是,我该怎么办?

Alb*_*ano 4

您的是与对象一起使用的连接字符串SqlConnection。由于这些对象仅支持 SQL Server,因此您不能使用该Provider关键字。此外,由于您使用的是 EF,因此需要指定不同的连接字符串才能使用数据库模型、上下文和关键字Provider。典型的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>
Run Code Online (Sandbox Code Playgroud)

为了使用 MySQL 提供程序,请考虑此答案中提供的以下步骤:

Entity Framework 6 提供了一些方便的细微更改,有助于使 MySQL 正常工作并创建动态数据库连接。让 MySQL 与实体框架 6 一起使用

首先,在我回答这个问题时,唯一与 EF6 兼容的 .Net 连接器驱动程序是 MySQL .Net Connectior 6.8.1(Beta 开发版本),可以在 MySQL 官方网站上找到它。

安装后,从 Visual Studio 解决方案中引用以下文件:

Mysql.Data.dll
Mysql.Data.Entity.EF6.dll
Run Code Online (Sandbox Code Playgroud)

您还需要将这些文件复制到项目在构建期间可以访问的某个位置,例如 bin 目录。

接下来,您需要将一些项目添加到您的 Web.config(或 App.config,如果基于桌面)文件中。

连接字符串:

<connectionStrings>
    <add name="mysqlCon"
         connectionString="Server=localhost;Database=dbName;Uid=username;Pwd=password"

         providerName="MySql.Data.MySqlClient" /> </connectionStrings>
Run Code Online (Sandbox Code Playgroud)

还可以在 和 节点内添加提供程序(在处理动态定义的数据库时,这是我答案的第二部分中绝对必须的),您可以更改节点:

<entityFramework>
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
    <providers>
        <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
    </providers> </entityFramework>
Run Code Online (Sandbox Code Playgroud)

如果更改默认 sql server 连接的 defaultConnectionFactory,请不要忘记删除嵌套在 defaultConnectionFactory 节点中的节点。MysqlConnectionFactory 的构造函数不接受任何参数,如果参数仍然存在,则会失败。