不支持的关键字:元数据

这一行:

WebSecurity.InitializeDatabaseConnection(connectionStringName: "DefaultConnection", userTableName: "UserProfile", userIdColumn: "UserID", userNameColumn: "UserName", autoCreateTables: true); 

投掷:

“System.ArgumentException”发生在System.Data.dll中,但未在用户代码中处理

其他信息:不支持关键字:“元数据”。

我的连接string是:

 add name="DefaultConnection" connectionString="metadata=res://*/TalyllynModel.csdl|res://*/TalyllynModel.ssdl|res://*/TalyllynModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=***********;initial catalog=********;persist security info=True;user id=*********;password=********;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.SqlClient" /></connectionStrings> 

不知道它在哪里出错。

您传递的string不是有效的数据库连接string,它是一个EF连接string ,在其provider connection string参数中包含一个SQL Server连接string。 WebSecurity.InitializeDatabaseConnection需要一个有效的数据库连接string

为避免自己parsing连接string,可以使用EntityConnectionStringBuilder类来parsingstring,并从其ProviderConnectionString属性中检索数据库连接string

当这发生在我身上时,是因为连接string有:

 providerName="System.Data.SqlClient" 

但应该是:

 providerName="System.Data.EntityClient" 

因为正如另一个答案所说,这是一个EF连接string。

只是添加另一种可能性(我遇到过) – 如果您正在开发/维护Azure Web应用程序,可能会使用保存在Azure的“应用程序设置”中的连接string。

在“应用程序设置”中的每个连接string旁边都有一个连接stringtypes的下拉菜单 – 很容易忘记将其设置为“自定义”entity framework值并将其保留在默认值(SQL数据库) – 这也会导致上述错误。

嗨,

在我看来,ADO.NET的连接string(在这种情况下是sqlConnection)不能使用'元数据。 你正在使用一个特定的entity framework。 ADO.NET应该是这样的:

 "data source=KAPS-PC\KAPSSERVER;initial catalog=vibrant;integrated security=True" 

所以,总结一下,你需要两个独立的连接string,一个用于EF,一个用于ADO.NET。

Souce: http ://forums.iis.net/post/2097280.aspx

我要抛出另外一个答案,以防万一有人像我一样通过同样奇怪的场景遇到这个问题。

首先,正如其他人所说,ADO连接string和EF连接string是不同的。

一个ADO连接string包含许多以分号隔开的字段,这些字段可以从一个连接types到另一个连接types,但通常会看到“数据源= xxx”,“初始目录= yyy”等。您将看不到“元数据= ZZZ”。

EF连接string具有相同的结构,但它具有“metadata = zzz”和“provider connection string = www”,其中“www”是转义的ADO连接string。

所以一个ADO连接string的正常格式是:

 data source=myserver; initial catalog=mydatabase; Persist Security Info=True; User ID=myusername; Password=mypassword; MultipleActiveResultSets=True 

而EF连接string的正常格式是:

 metadata=res://*/MyDbContext.csdl| res://*/MyDbContext.ssdl| res://*/MyDbContext.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连接string,并将其粘贴到需要ADO连接string的位置。 实质上,我做了同样的事情,但是这个过程并没有那么清晰。

在我的情况下,我有一个使用EF的Web应用程序,所以它的web.config正确包含EF连接string。

我发布了一个部署包,该过程会提示您在部署时使用连接string。 这些存储在部署包生成的SetParameters.xml文件中。

我剪切并将EF连接string粘贴到发布对话框的input字段中。

我部署了Web应用程序,试图访问它,并得到“关键字不支持:元数据”错误。

我没有意识到的是MS的发布工具期望一个ADO连接string,并给它它会构build一个EF连接string。

结果是SetParameters.xml和我部署的web.config有连接string,看起来像这样:

 metadata=res://*/MyDbContext.csdl| res://*/MyDbContext.ssdl| res://*/MyDbContext.msl; provider=System.Data.SqlClient; provider connection string=&quot; metadata=res://*/XxDbContext.csdl| res://*/XxDbContext.ssdl| res://*/XxDbContext.msl; provider=System.Data.SqlClient; provider connection string=&amp;quot; data source=myserver; initial catalog=mydatabase; Persist Security Info=True; User ID=myusername; Password=mypassword; MultipleActiveResultSets=True; application name=EntityFramework &amp;quot; &quot;" 

换句话说,embedded式提供程序连接string是一个EF连接string,而不是一个ADO连接string,所以当EF试图使用它连接到数据库时,会产生这个错误。

换句话说,当您将连接string粘贴到发布对话框中时,即使您正在从web.config中复制的内容是EF连接string,也需要粘贴ADO连接string而不是EF连接string。

您可以从EF连接string的提供程序连接string字段中提取ADO连接string,如果在部署中使用的是与本地开发中相同的连接,那么这将是您所需要的。

下面是我使用的一些代码,从连接string中提取数据库名称和服务器名称。

注意它是如何检查它是否是一个entity framework连接string,如果是,它将提取“提供程序连接string”部分,然后可以将其传递到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" 

当我启用相信我是启用ASP.NET身份2时,我有完全相同的错误。他们是不一样的! 启用了一个旧版本的身份pipe理,使用不同的表格结构来ASP.NET身份2(这不需要“启用”的方式 – 它只是在那里)。

如果您故意使用旧的angular色pipe理器,但仍然收到错误,您可能正在查看默认的localdb而不是数据库,在这种情况下,您可以修改指向您想要的任何连接string:

 <roleManager enabled="true" cacheRolesInCookie="true" defaultProvider="OurSqlRoleProvider" > <providers> <add connectionStringName="DefaultConnection" applicationName="/" name="OurSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" /> </providers> </roleManager> 

对于Azure Web App,连接stringtypes没有“System.Data.EntityClient”自定义工作良好。

在这里输入图像说明