不支持的关键字:元数据

问题描述 投票:44回答:10

这一行:

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

不知道我哪里出错了。

c# sql-server asp.net-mvc entity-framework
10个回答
58
投票

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

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


-1
投票

一个旧帖子,但我的解决方案,

不幸的是,这些并没有解决我使用Azure功能与EDMX的单独项目(类库)交谈。

我不得不编辑Context.CS类构造函数替换

: base ("Entities")

: base (ConfigurationManager.ConnectionStrings["Entities"].ConnectionString)

希望这可能会帮助其他有需要的人。


49
投票

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

providerName="System.Data.SqlClient"

但它应该是:

providerName="System.Data.EntityClient"

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


20
投票

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

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


3
投票

我将抛弃另一个答案,以防其他人通过与我一样的奇怪场景遇到这个问题。

首先,正如其他人所说,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=&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的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=&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;"

换句话说,嵌入式提供程序连接字符串是EF连接字符串而不是ADO连接字符串,因此当EF尝试使用它连接到数据库时,它会生成此错误。

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

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


2
投票

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

请注意它是如何检查它是否是实体框架连接字符串,如果是,它将提取“提供者连接字符串”部分,然后可以将其传递到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"

1
投票

对于Azure Web App,连接字符串类型没有“System.Data.EntityClient”,Custom工作正常。

enter image description here


1
投票

用于Azure应用程序设置=>连接字符串:

  1. 如果连接字符串是由EF-designer生成的,请务必将&qout;替换为字符串中的"
  2. 检查provider = System.Data.SqlClient
  3. 在下拉列表中选择“类型自定义”
  4. 如果连接用于模型(实体框架),请确保使用模型的正确路径例如:模型“MyWebRoot / Models / MyModel.edmx”配置为:metadata = res:///Models.MyModel.csdl | RES:///Models.MyModel.ssdl |资源://*/Models.MyModel.msl;

0
投票

嗨,

在我看来,ADO.NET的连接字符串(在本例中是DebugConnection)不能使用'元数据。您正在使用特定于Entity Framework的那个。 ADO.NET应该是这样的:

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

因此,总结一下,您需要两个单独的连接字符串,一个用于EF,另一个用于ADO.NET。

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


0
投票

入住这个地方

<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)

© www.soinside.com 2019 - 2024. All rights reserved.