【问题标题】:Keyword Not Supported: Metadata不支持关键字:元数据
【发布时间】:2013-11-25 02:08:55
【问题描述】:

这一行:

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

正在投掷:

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

附加信息:不支持关键字:“元数据”。

我的连接字符串是:

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


【解决方案1】:

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

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

【讨论】:

  • 我明白了。所以在我遵循一个例子之后,从这里说:msdn.microsoft.com/en-us/library/…。我需要将连接字符串保留在 web.config 文件中还是删除它?谢谢!
  • 也许 EF 连接字符串在我的机器上运行良好,但在 Azure 上却不行
  • “不在 Azure 上”没有多说。连接字符串的类型与环境无关。如果它们在代码相同的情况下在不同的环境中失败,那是因为它们指向的服务器在一个环境中不存在,或者在该环境中使用了无效的凭据。针对您的问题发布问题
  • 请参阅下面我的回答,了解“不在 Azure”问题的解决方案。
【解决方案2】:

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

providerName="System.Data.SqlClient"

但应该是:

providerName="System.Data.EntityClient"

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

【讨论】:

  • 这很难追查,只要你知道就很简单
  • 哇...这让我免于在寻找解决方案数小时后发疯!为什么在安装 EF 时这不会自动更新? +1
  • 意识到在 Azure 中我发现相反的情况。当我将 Azure 门户中 EF 的连接字符串更改为“System.Data.SqlClient”并在下拉列表中使用“自定义”类型时,它起作用了。
  • 谢谢你为我节省了一段时间
【解决方案3】:

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

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

【讨论】:

  • 这也解决了我的元数据关键字问题,但现在我有一个不支持的关键字:'server' update: had "在服务器前面,切换到单引号,现在一切正常。谢谢
【解决方案4】:

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

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

【讨论】:

  • 我打算分享一些看起来像这样的东西。
【解决方案5】:

我将抛​​出另一个答案,以防其他人遇到与我相同的奇怪场景。

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

一个 ADO 连接字符串包含许多用分号分隔的字段,它们可以非常从一种连接类型到另一种连接类型,但您通常会看到“数据源=xxx”、“初始目录=yyy”等。您将 看到“metadata=zzz”。

EF 连接字符串具有相同的结构,但它具有“metadata=zzz”和“provider 连接字符串=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 连接字符串,如果您在部署中使用与本地开发中相同的连接,这就是您所需要的。

【讨论】:

  • 我必须阅读此回复几次才能理解,但经过数小时的头疼和“不支持关键字”类型的消息,您的连接字符串示例终于解决了我的问题。做得很好。
【解决方案6】:

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

  1. 如果连接字符串由 EF-designer 生成,请务必将字符串中的 &amp;qout; 替换为 "

  2. 检查 provider=System.Data.SqlClient

  3. 在下拉菜单中选择自定义类型

  4. 如果连接用于模型(实体框架),请确保使用正确的模型路径 例如:模型“MyWebRoot/Models/MyModel.edmx”配置为:metadata=res:///Models.MyModel.csdl|res:///Models.MyModel.ssdl|res: //*/Models.MyModel.msl;

【讨论】:

  • 谢谢!这个答案今天在服务管理门户中救了我。
【解决方案7】:

嗨,

在我看来,ADO.NET 的连接字符串(在这个 caseSqlConnection) 不能使用'元数据。您正在使用一个特定的 对于实体框架。 ADO.NET 应该是这样的:

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

所以,总而言之,您需要两个单独的连接字符串,一个用于 EF 一个用于 ADO.NET。

来源:http://forums.iis.net/post/2097280.aspx

【讨论】:

    【解决方案8】:

    对于 Azure Web App,连接字符串类型没有“System.Data.EntityClient”自定义效果很好。

    【讨论】:

    • 当我这样做时,我收到错误消息“应用程序配置文件中的连接字符串 'myConnection' 不包含所需的 providerName 属性。”...如何在天蓝色功能设置?除此之外,您还进行了其他设置吗?
    【解决方案9】:

    干这个, 从您的 ConnectionString 中删除元数据信息。

    改变这个。

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

    <add name="DefaultConnection" connectionString="data source=***********;initial catalog=********;persist security info=True;user id=*********;password=********;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.SqlClient" /></connectionStrings>
    

    【讨论】:

    • 不错的尝试,但它对我不起作用。例外:“”初始化字符串的格式不符合从索引 218 开始的规范。”但我正在编写 C#,我的连接字符串来自旧的 VB EF 应用程序,所以它不起作用也许并不奇怪马上。在这种情况下没什么大不了的,我将创建一个新的连接字符串。
    【解决方案10】:

    在我给出我的解决方案之前让我解释一下,我也遇到了这个问题,我使用 EntityFramework 和 Ado.net 你不能在 ADo 中使用实体框架连接字符串,反之亦然,所以我所做的是在 Web.config 文件中我留下了 EF 连接字符串(元数据之一) 在 ADO 的控制器中,我添加了从数据库(属性)获得的连接字符串。像这样添加 ADO 字符串: SqlConnection sql = new SqlConnection();

    sql.ConnectionString = @"Data Source=.\alienbwr;Initial Catalog=ABTO_POS;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";(不要使用我的字符串)

    【讨论】:

      【解决方案11】:

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

      不幸的是,使用 Azure Functions 与带有 EDMX 的单独项目(类库)对话并没有为我解决这个问题。

      我必须编辑 Context.CS 类构造函数来替换

      : base ("Entities")

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

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

      【讨论】:

        【解决方案12】:

        检查这个地方

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

        【讨论】:

          猜你喜欢
          • 2014-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 1970-01-01
          • 1970-01-01
          • 2016-04-10
          • 1970-01-01
          相关资源
          最近更新 更多