2013-11-28 47 views
1

我正在關注官方的asp.net「使用MVC 4開始使用EF 5」。在該教程中,執行遷移時(在我的理解中)創建數據庫。當我使用Mvc 5教程查看EF 5時,他們沒有使用遷移來創建數據庫。他們使用數據庫初始化器。所以,我想知道如何在不使用EF 5中的遷移的情況下爲您的項目創建數據庫?另外,這兩種方法有什麼不同?你可以在EF5中創建一個沒有遷移的數據庫嗎?

回答

6

代碼優先遷移和使用軟件包管理器控制檯首先進行升級的命令可能會讓人有點困惑。 可以使用初始化器CreateDatabaseIfNotExistsDropCreateIfModelChangesDropCreateDatabaseAlwaysMigrateDatabaseToLatestVersion
看到界面IDatabaseInitializer<TContext>.

CreateDatabaseIfNotExists // is the Default initializer. 

所以這就是爲什麼它似乎EF只是做你的東西的時候。

所以答案是「是可以‘創建而不遷移數據庫’

但差異並不明顯,如果你要那麼做長期是另一個問題。 如果您正在使用的遷移。 如果沒有數據庫,那就意味着要創建數據庫 所以這就是爲什麼自動化遷移和CreateDB看起來很混亂,因爲它們有時會導致相同的結果,但從技術上講,它們是不同的。

所以一般來說是足夠的只能使用代碼第一次自動「遷移」。

遷移可以是自動或「管理」。 託管遷移方法調用生成代碼,調整代碼並運行PM commandlet或POwershell命令以實際執行遷移。

使用自動遷移,您只需設置intitializer並訪問DBContext。

這個過程有兩個部分。

a)DB初始化步驟。 在實例化YourDBContext之前執行此操作。使用遷移初始化時指定

//eg 
// DONT TOUCH MY DB or i break your back! 
Database.SetInitializer(new ContextInitializerNone<YourDbContext>()); // Do Nothing, 
// OR 
// yes migrate my db to match my code please. 
Database.SetInitializer(new MigrateDatabaseToLatestVersion<YourDbContext, YourMigrationConfiguration>()); // Set to migration is requested, see config class below 

的Confirguration類看起來像這樣

public class YourMigrationConfiguration<TContext> : DbMigrationsConfiguration<TContext> 
    where TContext : DbContext{ 

    protected YourMigrationConfiguration() { 
     AutomaticMigrationsEnabled = true; // run it when needed. Do not wait for my PM Command 
     AutomaticMigrationDataLossAllowed = true; // if the new db look means dropping tables or columns go ahead and kill my data. So use this option with caution. 

    } 

然後在需要時只觸發代碼的遷移。

Context.Database.Initialize(true); // i place this inside a method on my UoW class 

Code first Db initialization strategies.
Code first migrations recommended reading
Managed Migrations

有關於這一主題在網絡上的文章。

+0

感謝您的回覆。這幫助了我很多。 AutomaticMigrationEnabled設置爲true時有什麼區別?如果設置爲false,該怎麼辦?它有什麼不同? –

+0

對您的模型進行更改並進行嘗試,測試這些功能是讓他們感覺舒適的最佳方式。添加一個非常快速的搜索會發現http://stackoverflow.com/questions/11806570/automaticmigrationsenabled-false-or-true –

相關問題