2013-05-14 44 views
2

從EF和MVC開始,以下不同教程提供了關於將虛擬測試數據放入數據庫的正確位置的不同混淆想法。使用EF5代碼優先遷移將種子數據放在哪裏

所以我做了一些POCO類,我有一個BlahContext

​​

然後在Global.asax.cs中我初始化這樣的數據庫:

protected void Application_Start() 
{ 
    Database.SetInitializer(new DropCreateDatabaseAlways<BlahContext>()); 
} 

現在我做了以下在包管理器控制檯中:

PM> enable-migrations -contexttypename Blah.Models.BlahContext 
PM> add-migration Initial 
PM> update-database 

這創建了Configuration.cs,並且在那個類中有一個Seed()me thod - 生成的評論意味着這是放置種子數據的正確位置。所以我填它是這樣的:

internal sealed class Configuration : DbMigrationsConfiguration<Blah.Models.BlahContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(Blah.Models.BlahContext context) 
    { 
#if DEBUG 
     context.Blahs.AddOrUpdate(b => b.ID, 
      new Blah() { ID = 1, Name = "bum", }, 
      new Blah() { ID = 2, Name = "moo", } 
     ); 
#endif 
    } 
} 

現在,當我再次運行update-database,它將填充布拉赫表2個記錄「屁股」和「哞」。都好。

但是當我運行應用程序,它似乎Database.SetInitializer()呼叫Application_Start導致數據庫被重建,但這次Configuration.Seed()方法調用。所以數據不再存在。

我看到它創建了一個類,如一些其他教程:

class BlahContextInitializer : DropCreateDatabaseAlways<BlahContext> 

,然後的Application_Start樣子:

protected void Application_Start() 
{ 
    Database.SetInitializer(new BlahContextInitializer()); 
} 

然後在BlahContextInitializer.Seed()方法是在僞數據包含。這種策略僅適用於EF4.1嗎?

我應該在EF5中放入我的種子數據,以便它在應用程序啓動時不會被擦除?

回答

2

但是當我運行應用程序,它似乎Database.SetInitializer() 呼叫的Application_Start導致數據庫被重建,但 這次Configuration.Seed()方法沒有被調用。所以數據 不再存在。

如果您使用的是遷移,則應使用MigrateDatabaseToLatestVersion初始值設定項。
或者一起跳過初始化程序 - 如果您計劃手動遷移Db(使用Update-Database)。

問題是你有two different initializers(或初始化場景是精確的)試圖一起工作。這有完全不同的'計劃'。這是任何其他,但尤其是與DropCreateDatabaseAlways問題,並且無法工作

請記住,Migration Seed runs with each start of the application,所以它有點不同(比'典型'種子)。


如果你有一些複雜的場景(這確實需要你有一個典型的'種子'與你的初始化(就像之前完成) - 然後看到我的這篇文章如何創建這樣的自定義初始化...

What is the correct use of IDatabaseInitializer in EF?

How to create initializer to create and migrate mysql database?

+0

我沒有意識到如果使用「update-database」,我可以跳過初始化程序。此外,我從來不知道MigrateDatabaseToLatestVersion,它看起來應該工作,我會試試看。 – demoncodemonkey

+0

MigrateDatabaseToLatestVersion取得了訣竅。謝謝! – demoncodemonkey

+0

不客氣的朋友 – NSGaga

0

您可以將種子數據放入「BlahContextInitializer」中。您已將它設置爲刪除並在構建時重新創建數據庫,以便刪除所有數據,然後將其插回到表中。如果您希望將它初始化,請將DropCreateDatabaseAlways更改爲其他設置,或者在初始化數據後從global.asax註釋掉初始化程序。

+0

我看到該方法,但這意味着有一個BlahContextInitializer.Seed()以及Configuration.Seed()。由於當我使用「enable-migrations」時,我的EF5項目生成了Configuration.Seed(),我猜想BlahContextInitializer.Seed()是EF4.1的一個東西。 – demoncodemonkey

+0

我想。使用Configuration.Seed()如果它生成將是你最好的選擇。 –

1

感謝@NSGaga,這裏是我結束了:

protected void Application_Start() 
{ 
    Database.SetInitializer(
     new MigrateDatabaseToLatestVersion<BlahContext, Blah.Migrations.Configuration>() 
    ); 
} 

這既更新數據庫,然後按預期調用Configuration.Seed()。

現在,如果我改變我的模型,我仍然需要運行add-migration SomeChange,但我不需要再打擾update-database了。每當我運行應用程序時,它都會自動更新數據庫。

而且因爲它的遷移,而不是重新創建的數據庫,它不會消滅任何額外的數據出現,因此它可用於生產數據庫(這是我的另外一個擔憂的使用EF CF)

相關問題