2010-01-31 52 views
4

我的問題對於高級用戶來說可能有點不同或基本。需要生成EDMX文件並編譯它們

我有一個可由管理員定製的Web應用程序。這意味着,管理員可以添加新的表架構或編輯表列,添加新的表列等。這些更改映射到我們的邏輯對象(非常類似於EDMX),該對象在更改後發佈。在發佈的同時,我們生成了需要進行必要更改的存儲過程。

從UI我們使用這些邏輯對象DB(使用COM其中理解的映射,並執行適當的存儲過程和視圖等)來連接。現在我正在考慮使用EF來替換目前我們正在使用的邏輯對象模型。我可以動態創建EDMX文件(csdl,msl,ssdl,cs文件),但我不確定如何編譯它們並將這些類動態封裝到DLL中。這意味着,當我單擊按鈕時,將創建所有edmx相關文件,並且必須基於CS文件創建DLL,並且網站必須能夠訪問代碼中的新更改。

你能幫助我如何自動和動態編譯CS文件。我不會在客戶端擁有其他文件(如default.aspx等)的源代碼。

感謝 阿爾伯特

回答

2

Bepenfriends - 而不是從外殼在嘗試CSC,可以考慮使用CSharpCodeProvider.CompileAssemblyFromFile。

有一點要小心:如果你編譯代碼,然後嘗試重新編譯它,你可以在已創建的組件鎖定起來。爲此,我創建了一個AsyncCompiler,它創建一個新的AppDomain,在那裏編譯,然後卸載AppDomain。

這是一些晦澀的代碼,但我這樣做(生成AEF XML文件,從他們生成的代碼,然後編譯到一切的結合體),而且運作良好。我唯一沒有完全正確的是動態導入存儲過程 - 我的SSDL具有它們,但不包含CSDL或MSL。在這裏尋找解決方案。

我希望這裏的關鍵詞足以讓你走向正確的方向。

+0

感謝TonyG,是否有可能提供asynccompiler的代碼片段(可能是框架)。是的,你的關鍵詞將我帶到很多地方。 – Bepenfriends 2011-01-24 05:55:34

+0

你能概述你在編譯器中做了什麼嗎?我發現自己處於類似的情況。我試圖從edmx本身提取.csdl,.msl內容並將它們嵌入到程序集中。 – 2014-09-23 11:23:44

+0

不幸的是,我在四年前做過這件事,並且在一段時間內沒有重新訪問過它。所以我的記憶在這個時候對你來說毫無用處,所以很抱歉。但是這是一些非常酷的代碼,我可能會在後面挖掘。如果你正在參與一個公​​司項目,那麼也許我可以把時間放在這個(PM me)上,否則我不能優先考慮任何更多的努力。存儲過程中的問題是,它在我使用的EF版本中不受支持,但它現在應該是。希望我能在這裏幫助更多。 – TonyG 2014-09-23 15:59:14

0

我真的沒有給你一個明確的答案,只是還沒有 - 但有兩個潛在的解決方案,你可以看看,有可能在不久的將來:

1)有一組CodeSmith模板名爲PLINQO,它可以從您的數據庫生成您的Linq-to-SQL模型(DBMX)及其關聯的* .cs文件。我問他們關於實體框架支持我自己,他們證實正在開發 - 所以也許他們會很快有一段時間。

這是因爲它們的代碼和模型生成模板,你絕對可以採取那些LINQ到SQL和調整他們EDMX了。一點工作,但絕對有可能。一旦獲得* .cs文件和* .edmx模型,就可以使用安裝在每檯安裝了.NET的計算機上的CSC(C#)命令行編譯器來生成一個生成的程序集。 2)使用.NET 4,新的實體框架4將包括T4 templates(另一種代碼生成技術),它將允許您自定義您的代碼生成。這裏同樣適用 - 您可以從外部生成EDMX模型和關聯的* .cs文件,並從這些模板中隨時生成程序集。

關於該主題,另請參閱blog post,並且在gooling(或binging)或「EF4 T4模板」中應該找到大量信息。

希望至少有一點幫助!

+0

嗨,我能夠分別爲我的數據庫創建EDMX類和CSDL文件。這樣做沒有問題。我的問題是,每當我改變EDMX(從我的自定義框架),我需要將這些類編譯爲DLL(假設我具有相同的文件夾權限)。從網頁按鈕點擊。 我在這個地方(編譯)沒有在類的生成。我不知道如何從網站調用CSC(在服務器)。 – Bepenfriends 2010-02-02 16:30:26

相關問題