[英]Keyword Not Supported: Metadata
這一行:
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>
不知道我哪里出錯了。
您傳遞的字符串不是有效的數據庫連接字符串,它是一個EF 連接字符串,在其provider connection string
參數中包含 SQL Server 連接字符串。 WebSecurity.InitializeDatabaseConnection 需要有效的數據庫連接字符串
為了避免自己解析連接字符串,您可以使用EntityConnectionStringBuilder類來解析字符串並從其ProviderConnectionString屬性中檢索數據庫連接字符串
當這發生在我身上時,是因為連接字符串具有:
providerName="System.Data.SqlClient"
但它應該是:
providerName="System.Data.EntityClient"
因為正如另一個答案所說,它是一個 EF 連接字符串。
只是為了添加另一種可能性(我遇到過) - 如果您正在開發/維護 Azure WebApp,使用保存在 Azure 應用程序設置中的連接字符串,可能就是這種情況。
在應用程序設置中的每個連接字符串旁邊是連接字符串類型的下拉列表 - 很容易忘記將其設置為實體框架值的“自定義”並將其保留為默認值(SQL 數據庫) - 這也會導致上述錯誤.
這是我使用的一些代碼,用於從連接字符串中提取數據庫名稱和服務器名稱。
注意它如何檢查它是否是實體框架連接字符串,如果是,它提取其中的“提供者連接字符串”部分,然后可以將其傳遞給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"
我將拋出另一個答案,以防萬一其他人遇到和我一樣奇怪的情況。
首先,正如其他人所說,ADO 連接字符串和 EF 連接字符串是不同的。
一個 ADO 連接字符串包含許多以分號分隔的字段,它們可以從一種連接類型到另一種連接類型,但您通常會看到“數據源=xxx”、“初始目錄=yyy”等。您不會看到“元數據= zz”。
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 連接字符串,這就是您需要的,如果您在部署中使用與本地開發中相同的連接。
用於 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;
嗨,
在我看來,ADO.NET 的連接字符串(在本例中為 SqlConnection)不能使用 'metadata. 您正在使用特定於實體框架的一個。 ADO.NET 應該是這樣的:
"data source=KAPS-PC\\KAPSSERVER;initial catalog=vibrant;integrated security=True"
因此,總而言之,您需要兩個單獨的連接字符串,一個用於 EF,另一個用於 ADO.NET。
來源: http ://forums.iis.net/post/2097280.aspx
干這個,從你的 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>
在我給出我的解決方案之前,讓我解釋一下,我也遇到了這個問題,我使用 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";(不要使用我的字符串)
一個舊帖子,但我的解決方案,
不幸的是,這些並沒有為我解決這個問題,使用 Azure Functions 與一個帶有 EDMX 的單獨項目(類庫)交談。
我不得不編輯 Context.CS 類構造函數來替換
: base ("Entities")
與
: base (ConfigurationManager.ConnectionStrings["Entities"].ConnectionString)
希望這可以幫助其他有需要的人。
在這個地方檢查
<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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.