这一行:
WebSecurity.InitializeDatabaseConnection(connectionStringName: "DefaultConnection", userTableName: "UserProfile", userIdColumn: "UserID", userNameColumn: "UserName", autoCreateTables: true);
投掷:
System.Data.dll中发生'System.ArgumentException'但未在用户代码中处理
其他信息:不支持关键字:'元数据'。
我的连接字符串是:
add name="DefaultConnection" connectionString="metadata=res://*/TalyllynModel.csdl|res://*/TalyllynModel.ssdl|res://*/TalyllynModel.msl;provider=System.Data.SqlClient;provider connection string="data source=***********;initial catalog=********;persist security info=True;user id=*********;password=********;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.SqlClient" /></connectionStrings>
不知道我哪里出错了。
您传递的字符串不是有效的数据库连接字符串,它是一个EF connection string,在其provider connection string
参数中包含SQL Server连接字符串。 WebSecurity.InitializeDatabaseConnection需要有效的数据库连接字符串
为避免自己解析连接字符串,可以使用EntityConnectionStringBuilder类来解析字符串并从其ProviderConnectionString属性中检索数据库连接字符串
一个旧帖子,但我的解决方案,
不幸的是,这些并没有解决我使用Azure功能与EDMX的单独项目(类库)交谈。
我不得不编辑Context.CS类构造函数替换
: base ("Entities")
同
: base (ConfigurationManager.ConnectionStrings["Entities"].ConnectionString)
希望这可能会帮助其他有需要的人。
当我遇到这种情况时,这是因为连接字符串有:
providerName="System.Data.SqlClient"
但它应该是:
providerName="System.Data.EntityClient"
因为正如另一个答案所说,它是一个EF连接字符串。
只是为了增加另一种可能性(我遇到过) - 如果您正在使用Azure的应用程序设置中保存的连接字符串开发/维护Azure WebApp,则可能就是这种情况。
在“应用程序设置”中的每个连接字符串旁边都是连接字符串类型的下拉列表 - 很容易忘记将其设置为“自定义”以获取实体框架值并将其保留为默认值(SQL数据库) - 这也会导致上述错误。
我将抛弃另一个答案,以防其他人通过与我一样的奇怪场景遇到这个问题。
首先,正如其他人所说,ADO连接字符串和EF连接字符串是不同的。
ADO连接字符串包含许多以分号分隔的字段,这些字段可以从一种连接类型到另一种连接类型,但是您通常会看到“data source = xxx”,“initial catalog = yyy”等。您将看不到“metadata = ZZZ”。
EF连接字符串具有相同的结构,但它具有“metadata = zzz”和“provider connection string = 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=&quot;
data source=myserver;
initial catalog=mydatabase;
Persist Security Info=True;
User ID=myusername;
Password=mypassword;
MultipleActiveResultSets=True;
application name=EntityFramework
&quot;
""
换句话说,嵌入式提供程序连接字符串是EF连接字符串而不是ADO连接字符串,因此当EF尝试使用它连接到数据库时,它会生成此错误。
换句话说,当您将连接字符串粘贴到发布对话框中时,您需要粘贴ADO连接字符串,而不是EF连接字符串,即使您要复制的web.config中的内容是EF连接字符串也是如此。
您可以从EF连接字符串的提供者连接字符串字段中提取ADO连接字符串,如果您在部署中使用与本地开发中相同的连接,那么这就是您所需要的。
这是我使用的一些代码,用于从连接字符串中提取数据库名称和服务器名称。
请注意它是如何检查它是否是实体框架连接字符串,如果是,它将提取“提供者连接字符串”部分,然后可以将其传递到SqlConnectionStringBuilder
:
如果我没有这样做,我会得到那个令人讨厌的“Keyword Not Supported: Metadata
”错误。
if (connectionString.ToLower().StartsWith("metadata="))
{
System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder efBuilder = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder(connectionString);
connectionString = efBuilder.ProviderConnectionString;
}
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
DatabaseServer = builder.DataSource; // eg "MikesServer"
DatabaseName = builder.InitialCatalog; // eg "Northwind"
用于Azure应用程序设置=>连接字符串:
&qout;
替换为字符串中的"
。嗨,
在我看来,ADO.NET的连接字符串(在本例中是DebugConnection)不能使用'元数据。您正在使用特定于Entity Framework的那个。 ADO.NET应该是这样的:
"data source=KAPS-PC\KAPSSERVER;initial catalog=vibrant;integrated security=True"
因此,总结一下,您需要两个单独的连接字符串,一个用于EF,另一个用于ADO.NET。
入住这个地方
<add name="ConnectionString" connectionString="Data Source=SMITH;Initial Catalog=db_ISMT;Persist Security Info=True;User ID=sa;Password=@darksoul45;MultipleActiveResultSets=True;Application Name=EntityFramework"
providerName="System.Data.SqlClient" />
正如您所看到的,有两个连接字符串,一个用于ADO,另一个用于登录系统或任何您想要的。在我的例子中,ConnectionString用于登录系统,所以我在以下方面使用:
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
SqlCommand cmd = null;
SqlDataReader dr = null;
protected void Page_Load(object sender, EventArgs e)