2013-03-04 159 views
3

我使用實體框架與代碼優先(主要是因爲與RIA服務,您需要具有某種形式的代碼類的任何其他屬性)。從實體框架代碼優先的模型生成數據庫腳本

我想獲得一個數據庫生成腳本來輕鬆更新Visual Studio數據庫項目。我不想使用ef遷移,我更喜歡數據庫項目。

我可以使用類似

string sqlscript = (context as IObjectContextAdapter).ObjectContext.CreateDatabaseScript(); 

在運行時間,但我希望有一個方便的方法來獲得腳本,而不運行該項目以某種方式,而不使用遷移。

有沒有人有任何想法?

我在不同的項目中使用ef4.1和ef5。

[編輯:在回答這個問題將是一個遠遠高於從包管理器控制檯線路調用方式]

+0

遷移是在設計時創建的SQL腳本工具。目前,EF代碼首先與VS中的數據庫項目沒有整合。我會說你的工作流程使用了錯誤的方向。對於數據庫項目,您應該從數據庫定義開始,構建數據庫並從數據庫生成類。你的方向不被支持 - 至少正式,我懷疑它會很快。 – 2013-03-05 08:54:58

+0

@LadislavMrnka我不是在尋找任何整合。我只想要數據庫生成腳本,即什麼來自「ObjectContext.CreateDatabase」。 我只使用數據庫項目來生成更新腳本 - 基本上就像遷移一樣。我之所以不使用代碼優先的遷移,是因爲我懷疑它們比數據庫項目更不成熟,功能更完備。 – John 2013-03-05 11:38:37

回答

4

的方法之一是使用實體框架電動工具。他們爲包含DbContext類的文件添加一個上下文菜單項,該類爲數據庫生成一個DDL文件。

另一種方法是使用LinqPad。因爲它們需要第三方工具

(this as IObjectContextAdapter).ObjectContext.CreateDatabaseScript() 

兩種方式都是稍顯不便,但:在LinqPad打開DLL後,可以在查詢執行中的問題給出的代碼片段。

+1

只要你知道,你不需要linqPad。你可以用上面的語句寫一個簡單的cmdline工具,或者使用你的單元測試運行器輸出結果。 – 2013-05-16 22:09:59

+0

upvote for EF PowerTools建議 – 2013-12-08 11:39:30

1

您還可以使用ObjectQuery類生成自定義查詢。 下面是一個例子:

var query = from emp in context.Employees 
      select emp; 

var sqlScript = ((ObjectQuery)query).ToTraceString(); 
1

你可以考慮的一個方法是使用EF遷移來生成腳本,然後使用的MSBuild後生成的任務超過在構建時複製腳本到數據庫項目。

3

我已經啓用遷移,但我總是做得到在運行腳本,而不使用程序包管理器控制檯,因爲我有,只能在運行時根據包括在什麼項目參考文獻中發現的動態實體來更新數據庫。

的代碼拿到劇本是這樣的:

var config = new DbMigrationsConfiguration<MyContext> { AutomaticMigrationsEnabled = true }; 
var migrator = new DbMigrator(config); 
var scriptor = new MigratorScriptingDecorator(migrator); 
string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null);