簡體   English   中英

實體框架連接字符串中的元數據問題

[英]Trouble with metadata in Entity Framework connection string

我有一個使用RIA服務的Silverlight 4應用程序,其中我將所有RIA服務特定代碼移動到一個名為“AppServices”的單獨模塊(WCF RIA Services類庫)。 我們將主應用程序稱為“Silverlight4App”。 我需要針對與存儲其余數據的數據庫不同的數據庫對用戶進行身份驗證。 我已經向AppServices.Web添加了EF模型,這也是身份驗證服務當前所在的位置。 Web.config文件位於主應用程序中,即Silverlight4App中。

在web.config文件的connectionStrings部分中,我最初有這個:

<add name="AuthEntities" connectionString="metadata=res://*/AuthModel.csdl|res://*/AuthModel.ssdl|res://*/AuthModel.msl;provider=... />

我收到以下錯誤:

“查詢'GetUser'的加載操作失敗。無法加載指定的元數據資源。”

然后我嘗試了各種各樣的事情,如:

<add name="AuthEntities" connectionString="metadata=..\..\bin\AuthModel.csdl|..\..\bin\AuthModel.ssdl|..\..\bin\AuthModel.msl;provider=... />

並得到此錯誤:

“查詢'GetUser'的加載操作失敗。指定的元數據路徑無效。有效路徑必須是現有目錄,擴展名為”.csdl“,”。ssdl“或”.msl“的現有文件,或者標識嵌入資源的URI。“

我還嘗試將元數據文件復制到不同的位置。 最后,我進一步了解了以下內容。

<add name="AuthEntities" connectionString="metadata=~\..\..\..\Silverlight4App.Web\Metadata\AuthModel.csdl|~\..\..\..\Silverlight4App.Web\Metadata\AuthModel.ssdl|~\..\..\..\Silverlight4App.Web\Metadata\AuthModel.msl;provider=... />

使用上面的連接字符串,我收到以下錯誤:

“查詢'GetUser'的加載操作失敗。提供的連接字符串無效,因為它包含的映射或元數據信息不足。\\ r \\ nParameter name:connectionString內部異常消息:無法確定應用程序上下文.ASP.NET應用程序路徑無法解決。“

好吧,至少它似乎找到了元數據文件! 出於沮喪,我終於嘗試簡單地將整個路徑硬編碼到元數據文件:

<add name="AuthEntities" connectionString="metadata=C:\Users\...\Silverlight4App.Web\Metadata\AuthModel.csdl|C:\Users\...\Silverlight4App.Web\Metadata\AuthModel.ssdl|C:\Users\...\Silverlight4App.Web\Metadata\AuthModel.msl;provider=... />

它工作得很好!! 不幸的是,這是一個糟糕的解決方案,特別是當我去部署應用程序時。

我在硬編碼嘗試之前嘗試的嘗試(見上文)抱怨信息不足,但是硬編碼的嘗試(指向完全相同的文件 )似乎包含足夠的信息,這似乎很奇怪。 嗯...

有任何想法嗎? 我當然可以使用一些幫助!

查看帶有Reflector的已編譯程序集,查看資源是否存在; 如果是,則應使用第一種方法訪問它們。 如果沒有,那么您的部署會出現問題; 您總是可以選擇將它們部署為松散文件。 如果這沒有幫助,請求更多說明,明天我將在我的辦公桌旁,手頭的代碼進一步解釋(不得不在此前處理類似的事情)。

根據我的實驗:通過文件系統訪問時的元數據是通過Environment.CurrentDirectory的相對路徑完成的。 如果有什么東西在改變那個值,那么如果從exe路徑給出,它將會破壞你的相對路徑。 由於這種約束,使用嵌入式資源更穩定。

注意:編譯為嵌入式資源時,完整資源名稱與通過EntityDeploy編譯edmx時不同。 如果您仍然難以接收/找到元數據,請使用ilasmreflector提取已編譯的資源以確保資源名稱...

解決這個問題的最佳方法是創建一個工廠來生產EF對象。 工廠可以傳入一個edmxconnection對象,可以這樣生成:(請原諒VB)

Public Shared Function GetEDMXConnectionString(Of T As ObjectContext)(Optional ByVal connectionString As String = "") As EntityConnection
  Dim dbConnection As New SqlConnection(connectionString)
  Dim resourceArray As String() = {"res://*/"}
  Dim assemblyList As Assembly() = {GetType(T).Assembly}
  Dim metaData As New MetadataWorkspace(resourceArray, assemblyList)
  Dim edmxConnection As New EntityConnection(metaData, dbConnection)

  Return edmxConnection
End Function

然后可以通過構造函數將此連接傳遞到Context實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM