这一行:
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="data source=***********;initial catalog=********;persist security info=True;user id=*********;password=********;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.SqlClient" /></connectionStrings>
不知道我哪里出错了。
答案 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="
data source=myserver;
initial catalog=mydatabase;
Persist Security Info=True;
User ID=myusername;
Password=mypassword;
MultipleActiveResultSets=True;
application name=EntityFramework
"
遇到此问题的大多数人似乎已经切断了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="
metadata=res://*/XxDbContext.csdl|
res://*/XxDbContext.ssdl|
res://*/XxDbContext.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尝试使用它连接到数据库时,它会生成此错误。
换句话说,当您将连接字符串粘贴到发布对话框中时,您需要粘贴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)
答案 6 :(得分:1)
用于Azure应用程序设置=>连接字符串:
如果连接字符串是由EF-designer生成的,请确保将字符串中的&qout;
替换为"
。
检查该provider = System.Data.SqlClient
在下拉菜单中选择“自定义类型”
如果连接用于模型(实体框架),请确保使用正确的模型路径 例如:模型``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。
答案 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="data source=***********;initial catalog=********;persist security info=True;user id=*********;password=********;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.SqlClient" /></connectionStrings>
收件人
<add name="DefaultConnection" connectionString="data source=***********;initial catalog=********;persist security info=True;user id=*********;password=********;MultipleActiveResultSets=True;App=EntityFramework"" 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)
希望这可能会帮助其他有需要的人。