我创建了一个实体框架设计器图表,当我尝试生成数据库时,我必须建立与受密码保护的 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="server=localhost;User Id=the_user;database=the_db"" 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中提到的异常相同,但已本地化为我的语言。