不支持的关键字:元数据

ASP*_*450 52 c# sql-server asp.net-mvc entity-framework

这一行:

WebSecurity.InitializeDatabaseConnection(connectionStringName: "DefaultConnection", userTableName: "UserProfile", userIdColumn: "UserID", userNameColumn: "UserName", autoCreateTables: true);
Run Code Online (Sandbox Code Playgroud)

投掷:

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=&quot;data source=***********;initial catalog=********;persist security info=True;user id=*********;password=********;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.SqlClient" /></connectionStrings>
Run Code Online (Sandbox Code Playgroud)

不知道我哪里出错了.

Pan*_*vos 67

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

为避免自己解析连接字符串,可以使用EntityConnectionStringBuilder类来解析字符串并从其ProviderConnectionString属性中检索数据库连接字符串


Wil*_*ton 55

当我遇到这种情况时,这是因为连接字符串有:

providerName="System.Data.SqlClient"
Run Code Online (Sandbox Code Playgroud)

但它应该是:

providerName="System.Data.EntityClient"
Run Code Online (Sandbox Code Playgroud)

因为正如另一个答案所说,它是一个EF连接字符串.

  • 这很难追查,当你知道时很简单 (6认同)
  • 意识到在 Azure 中我发现相反的工作。当我将 Azure 门户中 EF 的连接字符串更改为“System.Data.SqlClient”并在下拉列表中使用类型“Custom”时,它起作用了。 (2认同)

ofl*_*ero 21

只是为了增加另一种可能性(我遇到过) - 如果您正在使用Azure的应用程序设置中保存的连接字符串开发/维护Azure WebApp,则可能就是这种情况.

在"应用程序设置"中的每个连接字符串旁边都是连接字符串类型的下拉列表 - 很容易忘记将其设置为"自定义"以获取实体框架值并将其保留为默认值(SQL数据库) - 这也会导致上述错误.


Mik*_*ill 7

这是我使用的一些代码,用于从连接字符串中提取数据库名称和服务器名称。

请注意它如何检查它是否是实体框架连接字符串,如果是,它会提取其中的“提供者连接字符串”部分,然后可以将其传递给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"
Run Code Online (Sandbox Code Playgroud)