簡體   English   中英

跨多個項目共享實體框架庫

[英]Sharing Entity Framework Library across multiple projects

我們有一個Entity Framework項目,其中包含使用.NET 4和VS2010設置的幾個模型。 然后我們有幾個項目需要使用這個實體項目。 我們成功地將EF項目編譯為DLL。 我們還成功地將EF dll參考添加到多個項目中,這些項目運行良好。

問題是現在我們有幾個程序(ASP.NET和控制台應用程序)引用這個EF dll並且dll在本地為每個調用程序復制,當我們對EF dll進行更改時,我們必須進入每個和每個項目,並用新版本替換EF dll。

我已經做了很多搜索在多個項目中共享庫甚至EF項目。 雖然我找到了幾個,但我似乎無法找到一個很好的例子,我可以為我的情況工作,或者不是那么老,以至於無關緊要。

這是我遇到的一般問題。 為了更好地了解我遇到的問題,我將重點關注一個特定的項目。 這是Intranet中的ASP.NET webform項目。 如果我們添加EF dll引用並允許項目在本地復制dll,則EF可以很好地工作。 但是,因為我們有多個項目,所以我們現在需要嘗試將EF dll集中在可由多個進程共享的地方。 我不是試圖設置它,以便跨多個服務器訪問一個EF dll。 如有必要,我很樂意在各個服務器上安裝DLL的副本。

我的願望是在每個服務器上創建一個“公共庫”目錄,簡化示例“C:\\ OurLibraries”。 然后我們將或者EF dll(以及后來的其他人)放到這個文件夾中,並允許各種程序/進程訪問EF dll的公共副本。 我已確保已從Intranet項目中刪除了EF dll的“本地副本”,並添加了對“C:\\ OurLibraries \\ OurEF.dll”文件的引用。 一切都很好,Intranet項目工作正常,直到它嘗試顯示一個引用EF的頁面,然后顯示一條錯誤消息:

“無法加載類型'EntityNS.ProductDBEntity'。”

如果我在引用中打開“本地副本”,則Intranet站點將再次正常工作。 我似乎無法找到允許我分享EF dll的魔法設置。

我根據各種帖子嘗試了以下內容,但沒有成功:

  • 簽署程序集並添加到GAC。 遇到過與“C:\\ OurLibraries”相同的問題

  • 將“C:\\ OurLibraries”目錄添加到PATH環境變量中。

  • 在我的intranet web.config文件中更改了EF的連接字符串,以從字符串中刪除“OR”:/Ecomedate.csdl |res:///Ecomedate.ssdl|res:///Ecomedate.msl;provider=System ...到;提供者=系統......

(基於這篇文章: 跨項目共享實體框架對象?

我花了很多時間研究這個並搜索論壇和帖子。 我知道必須有一種方法來做這個,否則代碼重用和DLL共享似乎沒用,所以任何你可以建議的幫助將不勝感激。

以下是我所做的額外努力以及對迄今為止的一些帖子的回應。

這也是我到目前為止在GAC中所經歷的。 - 在安裝了VS2010的計算機上,gacutil位於C:\\ Program Files \\ Microsoft SDK ...以及論壇上的問題“gacutil在哪里”的一般基調是gacutil現在被認為是開發工具而不是意圖用於生產環境。 Gacutil不是Server 2008或.Net 4框架的一部分,因此有幾個關於如何部署和處理GAC dll的建議

  • 首先,舊的安裝方式,使用gacutil,但通過使用psexec復制並調用生產服務器上的gacutil。 我可以讓psexec從本地開發盒運行gacutil到prod服務器並獲得返回代碼0,成功,但是我找不到實際查看它安裝在生產服務器上的方法,因為沒有gacutil在prod服務器上,我不能使用像gacutil / l DataEntity.dll這樣的東西查看已安裝dll的信息...如果它甚至安裝正確。
  • 我嘗試將gacutil.exe和gacutil.exe.config文件復制到生產服務器以嘗試從那里運行。 當程序運行並提供gacutil的版本號時,它不響應任何命令行開關,如gacutil.exe / i DataEntity.dll或gacutil.exe / l DataEntity。 它只是再次顯示gacutil版本信息並停止。
  • 有人在論壇上建議在prod機器上安裝Microsoft SDK。 雖然我可能不得不考慮到目前為止由於缺乏成功,但我真的不喜歡在我的生產環境中安裝SDK的想法。
  • 我試圖查找遠程GAC管理器等工具來查看和管理,但該開源項目的最后一次開發是2008年,所以當我嘗試使用它來查看GAC時,它希望向我展示c:\\ Windows \\程序集gac dll,但.NET 4現在使用C:\\ windows \\ Microsoft.NET \\ assembly存儲GAC dll,所以我似乎可以找到任何方法來查看或維護遠程生產服務器的gac上的DLL。 如果我在命令提示符下的c:\\ windows下運行dir DataEntity.dll / s命令,我會發現嵌入在C:\\ Windows \\ Microsoft.NET \\ assembly \\ GAC_MSIL目錄中的dll,但如果我試着查看通過C:\\ Windows \\ Microsoft.NET \\ assembly \\ GAC_MSIL中的資源管理器文件,我看不到dll,所以我找不到允許我在C:\\ Windows \\ Microsoft中管理(安裝,列出,卸載)DLL的工具服務器2008生產服務器上的.NET \\ assembly \\ GAC_MSIL。
  • 有人建議通過拖放將dll安裝到gac中。 我正在嘗試自動化我們的部署過程,因此不得不手動拖放並沒有多大意義。 復制到C:\\ Windows \\ Microsoft.NET \\ assembly \\ GAC_MSIL目錄也可以嗎? 我已經嘗試過了,但是因為我找不到一個能讓我看到已安裝/注冊的DLL的工具,我無法判斷它是否有效。
  • 另一個建議是創建一個只安裝到GAC的安裝程序。 我嘗試了這種方法並遇到了幾個問題。 首先,這是一個非常手動的過程。 我無法弄清楚如何從GAC卸載舊的DLL然后在gac中安裝新版本的DLL; 它一直堅持我先卸載以前的安裝。 其次,當我嘗試卸載dll時,它一直說它正在被另一個應用程序使用。 我嘗試重新啟動然后卸載它,但沒有去。 我終於想通了它是IIS,不得不關閉IIS,卸載,重啟,安裝,然后重啟IIS。 這是一個痛苦,但嘗試和自動化。

似乎應該有一種更好的方法將dll部署到生產環境到共享目錄中。 我只是想嘗試將DataEntity.dll放在ac:\\ MyLibraries目錄中,讓進程訪問DLL的一個副本。 微軟用C:\\ Program Files \\ Common Files做到了,所以它應該是可能的,但我現在花了幾天時間試圖找到一種可以大大減少GAC或安裝程序選項所帶來的維護工作的方法,減少重復dll的數量,並且如果允許“在本地復制”,則避免忽略替換dll。

您的問題的最佳解決方案是使用Web Services 。為此目的創建.web服務。您可以構建一個WCF服務庫,然后在所有項目中使用它的方法。

祝好運

這可能看起來很“外面”作為解決方案,但我們正在考慮使用Git存儲庫對多個服務器進行遠程發布,Git存儲庫將使用最新的DLL(並且只有DLL)提交,然后推送到每個生產服務器/應用服務器。

GAC方法可能是您所尋找的最接近的方法。 由於您無法使GAC正常工作,因此您應仔細檢查以確保遵循GAC中的安裝說明。

暫無
暫無

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

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