不支持的关键字:元数据

这一行:

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> 

不知道它在哪里出错。

  • 为什么我会在SQL中selectCHAR over VARCHAR?
  • SQL Server:PIVOTingstring数据的示例
  • 我如何创build一个基于2列的SQL唯一约束?
  • SqlParameter已经被另一个SqlParameterCollection包含了 - 是否使用(){}作弊?
  • 获取表和索引存储大小在SQL Server中
  • 将MIN聚合函数应用于BIT字段
  • 如何使用INFORMATION_SCHEMAfind默认约束?
  • 身份增量在SQL Server数据库中跳跃
  • 8 Solutions collect form web for “不支持的关键字:元数据”

    您传递的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”自定义工作良好。

    在这里输入图像说明