我将抛出另一个答案,以防其他人遇到与我相同的奇怪场景。
首先,正如其他人所说,ADO 连接字符串和 EF 连接字符串是不同的。
一个 ADO 连接字符串包含许多用分号分隔的字段,它们可以非常从一种连接类型到另一种连接类型,但您通常会看到“数据源=xxx”、“初始目录=yyy”等。您将 不看到“metadata=zzz”。
EF 连接字符串具有相同的结构,但它具有“metadata=zzz”和“provider 连接字符串=www”,其中“www”是转义的 ADO 连接字符串。
所以 ADO 连接字符串的正常格式是:
data source=myserver;
initial catalog=mydatabase;
Persist Security Info=True;
User ID=myusername;
Password=mypassword;
MultipleActiveResultSets=True
虽然 EF 连接字符串的正常格式是:
metadata=res://*/MyDbContext.csdl|
res://*/MyDbContext.ssdl|
res://*/MyDbContext.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=myserver;
initial catalog=mydatabase;
Persist Security Info=True;
User ID=myusername;
Password=mypassword;
MultipleActiveResultSets=True;
application name=EntityFramework
"
遇到此问题的大多数人似乎已经剪切了一个 EF 连接字符串并将其粘贴到需要 ADO 连接字符串的位置。本质上,我做了同样的事情,但过程并没有那么清晰。
就我而言,我有一个使用 EF 的 Web 应用程序,因此它的 web.config 正确包含 EF 连接字符串。
我发布了一个部署包,该过程会提示您输入要在部署时使用的连接字符串。这些存储在部署包生成的 SetParameters.xml 文件中。
我将 EF 连接字符串剪切并粘贴到发布对话框的输入字段中。
我部署了 Web 应用程序,尝试访问它,但出现“不支持关键字:元数据”错误。
我没有意识到 MS 的发布工具需要一个 ADO 连接字符串,并且给定它会构造一个 EF 连接字符串。
结果是 SetParameters.xml 和我部署的 web.config 具有如下所示的连接字符串:
metadata=res://*/MyDbContext.csdl|
res://*/MyDbContext.ssdl|
res://*/MyDbContext.msl;
provider=System.Data.SqlClient;
provider connection string="
metadata=res://*/XxDbContext.csdl|
res://*/XxDbContext.ssdl|
res://*/XxDbContext.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=myserver;
initial catalog=mydatabase;
Persist Security Info=True;
User ID=myusername;
Password=mypassword;
MultipleActiveResultSets=True;
application name=EntityFramework
"
""
换句话说,嵌入式提供程序连接字符串是EF连接字符串而不是ADO连接字符串,所以当EF试图使用它连接数据库时,它产生了这个错误。
换句话说,当您将连接字符串粘贴到发布对话框中时,您需要粘贴 ADO 连接字符串,而不是 EF 连接字符串,即使您要复制的 web.config 中的内容是EF 连接字符串。
您可以从 EF 连接字符串的提供程序连接字符串字段中提取 ADO 连接字符串,如果您在部署中使用与本地开发中相同的连接,这就是您所需要的。