簡體   English   中英

如何在Code First程序集中嵌入EDMX?

[英]How to embed EDMX in a Code First assembly?

我們在EF6.1中使用Code First - 我們的模型現在超過300多個表,啟動時間很荒謬。 我們已經嘗試過預生成視圖,但它沒有多大幫助,它是Code First管道中的模型編譯,占用了大部分時間。

我們將嘗試使用Database / Model First方法通過使用具有到CSDL,SSDL和MDL文件的元數據鏈接的實體連接字符串而不是直接SQL連接來初始化上下文。 這將是我們理想的過程:

  1. 在編譯包含Code First模型的項目之后,運行后構建任務,從DbContext生成EDMX文件,將其拆分為組件CSDL,SSDL和MDL文件,並將這些文件作為資源嵌入到程序集中
  2. 當我們通過自己的工廠創建上下文時,我們將原始SQL連接字符串包裝在EntityConnectionStringBuilder中,Metadata屬性指向嵌入的資源,並使用構建器連接字符串初始化DbContext

初始測試顯示啟動時間縮短了約80% - 這里的棘手部分是在第1步中進行構建后資源嵌入!

任何人都可以提供任何關於如何在MSBuild中完成第1步的線索嗎? 是否有另一種策略可行? 基本上我們需要零維護解決方案,以便開發人員不必手動執行除構建代碼之外的任何操作,也不需要特殊的部署注意事項。

編輯:

我們最終使用了一個新的獨立類庫項目,該項目引用了包含Code First模型的項目。 該項目包含一個T4模板,它將EDMX從DbContext寫入內存,然后將組件部分保存到已標記為嵌入資源的項目文件中,因此我們也獲得了源代碼控制。

構建順序保證資源始終是最新的,實體連接字符串在運行時引用此資源程序集。 通過使用T4 MSBuild集成目標完成MSBuild集成,以便模板始終在項目構建期間運行。

您當然可以使用MSBuild執行此操作。 你將不得不拿起一些構建腳本,但不應該太糟糕。

你現在怎么樣? 您是否有運行的控制台應用程序來生成edmx? 聽起來你已經完成了很難 - 與MSBuild集成應該很容易。 我會假設你這樣做,並從那里開始。

順便說一句:要知道的一件事是.csproj文件 MSBuild腳本,因此任何自定義MSBuild腳本都可以進入那些csproj文件。

為了增加復雜性,您可以:

  • 將“After build”事件添加到執行控制台應用程序的項目中。 此選項不需要任何MSBuild腳本 - 您只需在項目選項中設置After build事件。 但它總會運行。 (我認為你不能使后期構建事件依賴於配置),因此它可能會減慢編譯時間。
  • 您可以使用MSBuild中的Exec任務來執行您的控制台應用程序。 這需要對csproj文件進行一些編輯,但如果需要,可以將其設置為條件。 以下是Exec任務的鏈接: http//msdn.microsoft.com/en-us/library/x8zx72cd.aspx如果將其放在名為“AfterBuild”的目標中,它將在構建完成后自動執行。
  • 您可以編寫自己的構建任務 - 這是將在構建期間加載和執行的ac#類。 這是最復雜的方法,但它也為您提供最大的控制權: http//blogs.msdn.com/b/msbuild/archive/2006/01/21/515834.aspx

關於最后一個選項(自定義構建任務)的一個好處是,您可以將錯誤消息寫回構建過程。 如果任務失敗,這應該有助於獲取有用的信息,如果您使用構建服務器,那么服務器應該以與任何其他構建消息相同的方式獲取這些消息。

暫無
暫無

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

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