5

我正在爲一個相當大的項目構建腳本。其中一個項目需要將實體框架模型編譯到一個庫中。由於構建服務器的工作方式,所有構建都是手工製作的,以管理各種部署方案,而不會影響開發人員和項目文件。使用MSBuild構建實體框架模型而不使用項目文件?

反正有沒有使用Visual Studio生成的項目文件使用MSBuild任務生成EF模型?目前,實際的程序集使用CSC任務進行編譯,但是實際部署的應用程序失敗,因爲EF模型未包含在已編譯的程序集中。

目標或構建任務可用於生成模型並創建嵌入程序集所需的資源的任何指針?

請注意

該項目編譯在Visual Studio正常,但是使用構建服務器上的項目文件是不是一種選擇,因爲有需要進行該項目在部署時的各種變化,並且這是通過開發團隊控制之外的自定義構建腳本來控制的。這已經成功地爲少數項目工作,但EF模型在這個特定的場景中引起一些頭痛。

更新

目前的解決方案是不理想,但工作。項目文件已被修改,以將EF模型資源複製到新版本構建中的項目文件夾中,然後將其檢入源代碼控制。當構建腳本在服務器上運行時,EF模型將嵌入到程序集中。這似乎是目前可行的解決方法。

回答

4

我實際上處理了這個問題,因爲我的項目的源代碼樹沒有正確設置來運行Entity Framework的構建任務,該任務生成並在輸出dll中嵌入資源。

我調查了以下選項:

使用EntityDeploy MSBuild任務

如果您在記事本中打開.csproj的文件,你會看到一個XML有點像

<EntityDeploy Include="MyEntities.edmx"> 
    <Generator>EntityModelCodeGenerator</Generator> 
    <LastGenOutput>MyEntities.Designer.cs</LastGenOutput> 
</EntityDeploy> 

這是使用的msbuild任務Microsoft.Data.Entities.Build.targetsMicrosoft.Data.Entities.Build.dll讀取edmx文件,生成ssdl,csdl和msl文件,然後將它們嵌入到目標dll中。 (這些文件可以在C:\ Windows \ Microsoft.NET \ Framework \ v3.5中找到)。

使用EdmGen

克雷格指出的那樣,你也許能夠使用EdmGen.exe所附帶的框架。我放棄了這一步,但是我已經對我的edmx文件中的數據進行了一些定製,並且EdmGen.exe似乎真的想從原始數據庫中進行初始生成。

使用EdmGen2

EdmGen2.exe是一個開源項目,它確實比EdmGen多一點。我最終使用它來生成ssdl,csdl和msl文件。您可以將它指向您的edmx文件,它將生成必需的ssdl,csdl和msl文件。然後我包括這一起我的DLL和修改連接字符串從

connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl; 

connectionString="metadata=./MyEntities.csdl|./MyEntities.ssdl|./MyEntities.msl; 

注意我說的是實體框架,這些文件在同一目錄中我的DLL,不嵌入作爲資源。

所有這三個,構建任務,EdmGen和EdmGen2都是很薄的包裝器,它們爲所有困難的東西調用System.Data.Entity.dll。作爲最後的手段,你可以在構建任務dll的反射器中看看它在做什麼。

希望這會有所幫助。

1

是的,有一個名爲EdmGen的命令行實用程序可以執行此操作。對於可能的開關使用EdmGen /?