不支持的关键字:元数据

时间:2013-11-25 02:08:56

标签: c# sql-server asp.net-mvc entity-framework

这一行:

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>

不知道我哪里出错了。

12 个答案:

答案 0 :(得分:59)

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

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

答案 1 :(得分:50)

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

providerName="System.Data.SqlClient"

但它应该是:

providerName="System.Data.EntityClient"

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

答案 2 :(得分:20)

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

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

答案 3 :(得分: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连接字符串,如果您在部署中使用与本地开发中相同的连接,那么这就是您所需要的。

答案 4 :(得分:2)

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

注意它是如何检查它是否是实体框架连接字符串,如果是,它会提取&#34;提供者连接字符串&#34;其中的一部分,然后可以传递到SqlConnectionStringBuilder

如果我没有这样做,我就会感到讨厌&#34; Keyword Not Supported: Metadata&#34;错误。

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 :(得分:1)

对于Azure Web App,连接字符串类型没有&#34; System.Data.EntityClient&#34; 自定义效果良好。

enter image description here

答案 6 :(得分: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|res: // * / Models.MyModel.msl;

答案 7 :(得分:0)

  

您好,

     

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

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

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

     

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

答案 8 :(得分: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)

答案 9 :(得分:0)

干这个, 从您的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>

答案 10 :(得分:0)

在我给出我的解决方案之前,让我解释一下,我也遇到了这个问题,我使用 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 :(得分:-1)

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

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

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

: base ("Entities")

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

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