1

我创建了一个实体框架设计器图表,当我尝试生成数据库时,我必须建立与受密码保护的 MySql 数据库的连接。我选择不在自动生成的字符串中包含敏感的连接数据,所以我在 App.config 中得到了一个没有密码的连接字符串:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="DomainContainer" connectionString="metadata=res://*/Domain.csdl|res://*/Domain.ssdl|res://*/Domain.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;User Id=the_user;database=the_db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

显然,如果我然后像这样实例化 ObjectContext:

var dc = new DomainContainer();

我得到一个异常(“底层提供程序在打开时失败。”),因为 MySql 需要身份验证。如果我从 App.config 中删除连接字符串,而是将实例化代码更改为:

var connectionString = string.Format("metadata=res://*/Domain.csdl|res://*/Domain.ssdl|res://*/Domain.msl;provider=MySql.Data.MySqlClient;provider connection string=\";server=localhost;User Id=the_user;Password={0};database=the_db\"", password);
var dc = new DomainContainer(connectionString);

然后 ObjectContext 能够连接并正确地将更改持久保存到数据库(我现在只尝试执行插入)。

我知道这不是通过代码提供连接字符串的推荐方式,而是我应该使用连接字符串构建器。但是我想指出,在从 App.config 提供的连接字符串切换到提供的代码的过程中,providerName="System.Data.EntityClient" 一条信息丢失了,而实体框架似乎仍在运行正确。那么,这条信息在某种程度上是多余的吗?

更新(可能无关)

我重新运行 MySQL 安装程序以仔细检查安装是否正常,并添加一个没有密码身份验证的新 MySQL 用户(顺便说一下,我没有得到这样的选项)。相反,MySQL 安装程序安装了一个挂起的更新(Visual Studio 1.0.2 的 MySQL),它似乎损坏了我的安装:现在几分钟前曾经正常工作的程序引发了一个从未见过的 ArgumentException:

The specified store provider cannot be found in the configuration, or is not valid.

更新到更新

看起来安装程序在我系统的不同目录中创建了相同 MySQL 程序集的几个副本;也许运行时会感到困惑?但是,将以下内容添加到 App.config 可以解决问题:

  <system.data>
    <DbProviderFactories>
      <add name="MySQL Data Provider"
           invariant="MySql.Data.MySqlClient"
           description=".Net Framework Data Provider for MySQL"
           type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
    </DbProviderFactories>
  </system.data>

即使我仍然在 Visual Studio 的错误控制台中收到错误消息:

Errore  1   Errore 175: Il provider dell'archivio specificato non è stato trovato nella configurazione oppure non è valido. C:\Users\Dario\Documents\Programming\EFTest\EFTest\Domain.edmx  7   5   EFTest

这听起来与Update中提到的异常相同,但已本地化为我的语言。

4

0 回答 0