2013-11-25 75 views
36

這條線:關鍵字不支持:元數據

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> 

不知道在那裏我去錯了。

+0

您是否嘗試過手動連接?你有沒有確認這些憑證? –

回答

47

您傳遞的字符串不是有效的數據庫連接字符串,它是一個EF connection string,其provider connection string參數中包含SQL Server連接字符串。 WebSecurity.InitializeDatabaseConnection需要一個有效的數據庫連接字符串

爲了避免自己進行解析連接字符串,則可以使用EntityConnectionStringBuilder類來解析字符串並從其ProviderConnectionString財產

+0

我明白了。因此,在我按照以下示例進行說明後:http://msdn.microsoft.com/zh-cn/library/bb738533(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code -snippet-2。我是否需要將連接字符串保存在web.config文件中,還是要刪除它?謝謝! – ASPCoder1450

+0

也許By the EF連接字符串在我的盒子上運行良好,但不在Azure上 –

+1

「不在Azure上」並不多說。連接字符串的類型與環境無關。如果在代碼相同的情況下它們在不同的環境中失敗,那是因爲它們指向的是不在一個環境中的服務器,或者在該環境中使用無效的憑據。發佈問題與您的問題 –

40

檢索數據庫連接字符串當這發生在我身上這是因爲連接字符串有:

providerName="System.Data.SqlClient" 

,但它應該是:

providerName="System.Data.EntityClient" 

因爲被對方的回答說,這是一個EF連接字符串。

+5

這可以很難追查,簡單的時候你知道 – jolySoft

+1

哇...這救了我瘋了幾小時尋找解決方案!爲什麼在安裝EF時不會自動更新?+1 – jom

16

我想補充另一種可能性(這是我遇到過) - 如果你正在開發/維護的Web應用程序Azure的使用保存在Azure的應用程序設置一個連接字符串,這可能是這種情況。

在應用程序設置中的每個連接字符串旁邊都有一個連接字符串類型的下拉列表 - 它很容易忘記將它設置爲'自定義'對於實體框架值並將其保留在默認值(SQL數據庫) - 也是導致上述錯誤。

+1

這也固定了我的元數據關鍵字問題,但現在我有一個不支持的關鍵字:'服務器' 更新:在服務器前有",切換到單引號,所有工作現在。 thx –

0

嗨,

在我看來,對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

1

我要扔了另一個答案,萬一別人通過同一個奇怪的場景像我一樣運行到這一點。

要下手,正如其他人所說,ADO連接字符串和EF連接字符串是不同的。

ADO連接字符串包含許多以分號分隔的字段,這些字段可以從一種連接類型到另一種連接類型,但通常會看到「數據源= xxx」,「初始目錄= 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試圖用它來連接數據庫時,它會產生這個錯誤。

換句話說,當您將連接字符串粘貼到發佈對話框中時,即使您正在複製的web.config中的內容是,您需要粘貼ADO連接字符串而不是EF連接字符串一個EF連接字符串。

您可以從EF連接字符串的提供程序連接字符串字段中提取ADO連接字符串,如果您在部署中使用的連接與本地開發中使用的連接相同,那麼這將是您所需要的。

+0

我不得不閱讀這個回覆幾次,因爲它是有道理的,但經過幾個小時的頭部劃傷和「不支持關鍵字」類型的消息,您的連接字符串示例最終解決了我的問題。做得很好。 –

0

下面是我使用的一些代碼,從連接字符串中提取數據庫名稱&服務器名稱。

注意它是如何檢查,如果它是一個實體框架連接字符串,如果是這樣,它提取的是,「供應商連接字符串」的一部分,那麼它可以傳遞到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" 
0

當我啓用相信我啓用ASP.NET身份2時,我有完全相同的錯誤。他們是不一樣的!啓用了身份管理的舊版本,該版本使用與ASP.NET Identity 2不同的表結構(不需要「啓用」方式 - 它就在那裏)。

如果您有意使用舊的角色經理和仍然得到你可能會尋找在默認的LocalDB,而不是你的數據庫中的錯誤,在這種情況下,你可以修改任何連接字符串,使其指向你想要的:

<roleManager 
 
     enabled="true" 
 
     cacheRolesInCookie="true" 
 
     defaultProvider="OurSqlRoleProvider" 
 
    > 
 
     <providers> 
 
      <add 
 
      connectionStringName="DefaultConnection" 
 
      applicationName="/" 
 
      name="OurSqlRoleProvider" 
 
      type="System.Web.Security.SqlRoleProvider" /> 
 
     </providers> 
 

 
    </roleManager>

如果您是使用ASP.NET身份2後,這裏是它的一篇文章: http://johnatten.com/2014/04/20/asp-net-mvc-and-identity-2-0-understanding-the-basics/

0

對於Azure Web App,連接字符串類型沒有「System.Data.EntityClient」定製工作良好。

enter image description here

+0

當我這樣做時,我得到錯誤說:「應用程序的配置文件中的連接字符串'myConnection'不包含所需的providerName屬性。」...您如何添加供應商名稱在天藍色的功能設置?你在旁邊做了其他任何事情嗎? – batmaci

-1

一個老的文章,但我的解決方案,

不幸的是這些並沒有解決這個問題我使用Azure的功能跟一個單獨的項目(類庫)與EDMX的。

我不得不編輯Context.CS類的構造函數與

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

更換

: base ("Entities")

希望這可以幫助別人有需要的人。

相關問題