2014-04-29 75 views
1

當我開始我的第一個EF代碼第一次遷移,我在構造函數中使用DbContextDatabase.SetInitializer調用一個派生類DropCreateDatabaseAlways<MyDbContext>我能夠再從頭開始重新創建下降數據庫,但是我來到了一個跨遷移我完全不知道爲什麼使用我的舊方法遷移?我還注意到,DropCreateDatabaseAlways<MyDbContext>IdentityDbContext工作,我得到了錯誤:如果目的是一樣的,爲什麼使用遷移過dbinitializer The model backing the 'IdentityDb' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).EF 6 VS dbinitializer

遷移VS dbinitializer ? 也許我在比較兩種不同的東西,但我可以說的是,我完全失去了。

回答

4

DbInitializer從頭創建該數據庫。而已。

遷移提供了比DbIntitializer更多的功能。

數據庫版本控制

遷移,可以做你的數據庫中的每個更改保存,每個數據庫更新存儲,最終創造修訂關卡。類似於源代碼控制如果你很熟悉。

您可以遷移到特定版本,前進或後退。例如,您可以從版本4(最新)降級到版本2,並且只會丟失您刪除的列/表中的數據。

比方說你的數據庫看起來像這樣在第4版

Version 4 
ID | FirstName  | LastName 
-------------------------------- 
1  | John   | Smith 
2  | Michael  | Smith 

第2版沒有LastName列,如果遷移從4比2,這意味着你會保留數據IDFirstName

Version 2 
ID | FirstName  
----------------- 
1  | John   
2  | Michael  

提取SQL腳本

遷移允許你創建升級和降級SQL腳本。使用DbInitializer,你如何更新生產數據庫?手動?創建一個冰雹瑪麗腳本?

與移民,如果有什麼部署,部署團隊可以輕鬆地降級數據庫(又何妨呢)

額外的數據庫註釋

隨着遷移過程中出了問題,你可以自定義你的數據庫是怎麼看起來像。例如:具有默認值的列?遷移讓你受到保護。

數據運動

我假設你的數據庫沒有任何需要初始數據還沒有,像物品的DropDownList選項。通過遷移,您可以自定義更新SQL腳本來設置初始數據。例如:國家列表。

另一種情況是移動你的數據,可以說你決定將Name列分成FirstName和LastName。

新的開始

當然,遷移,可以從頭開始創建一個數據庫,就像DbInitializer。

教程:http://msdn.microsoft.com/en-us/data/jj591621

+0

非常感謝花時間來解釋。 +1 – Maro

1

你說你自己你下降你的數據庫。遷移保留數據。這是一個巨大的優勢 - 我當然不會放棄生產中的數據庫。

+0

怎麼樣發展ENV在那裏我不介意下降我的數據庫? – Maro

+0

存在數據庫來保存數據。您打算如何修改生產模式而不丟失數據? –