2013-05-28 19 views
28

的)方法,我有2個問題:如何運行種子(配置類遷移

1)如何運行種子()方法從包管理器控制檯而不更新數據庫模式?

2)有沒有辦法如何在代碼中調用Seed()方法?

Thx任何建議。

+1

我就遇到了這個問題與EF6前階段的更改,然後意識到我有錯誤的默認項目選擇,所以更新的數據庫沒有找到一個配置來運行。值得注意的是,在EF6中執行更新數據庫將始終運行Seed()方法。我不知道這是否寫在這是真的。 – allen1

回答

20

研究後,我終於找到了解決此問題的:

1)請Configuration市民:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere> 

2)添加以下的任意位置的代碼。它將運行最新的遷移並更新您的數據庫:

Configuration configuration = new Configuration(); 
configuration.ContextType = typeof(YourContextClassHere); 
var migrator = new DbMigrator(configuration); 

//This will get the SQL script which will update the DB and write it to debug 
var scriptor = new MigratorScriptingDecorator(migrator); 
string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null).ToString(); 
Debug.Write(script); 

//This will run the migration update script and will run Seed() method 
migrator.Update(); 
+12

這回答了第二部分的問題,但第一部分怎麼樣 如何從package-manager控制檯運行Seed()方法而不更新數據庫模型? –

+1

我第二.. –

0

如果使用上下文initiliazer作爲MigrateDatabaseToLatestVersion,則應該自動運行配置中的種子方法。不要以爲你需要手動調用它。

+0

但是如果我想稱它爲manualy?我在包管理器控制檯中創建了更新數據庫,並運行我的Seed()方法。但是我之後我做了一些刪除DB中信息的工作。所以我想獨立運行update-database的Seed()方法。有任何想法嗎? – Maris

+0

一個選項是創建用於遷移的sql腳本。這可以通過使用update-database -script -targetmigration:來實現。腳本創建完畢後,您可以在腳本末尾添加您想要的任何種子信息。這些將是sql插入語句。您可以在創建的遷移文件的up方法中運行腳本。 – Ravi

3

回答問題#2:從Seed()方法中提取所有代碼到另一個類。然後調用從配置類種子()方法中:

protected override void Seed(DbContext ctx) 
    { 
     new DatabaseSeed().Seed(ctx); 
    } 

然後你可以從任何地方調用它:

new DatabaseSeed().Seed(new DbContext()); 
28

回答你的第一個問題。通過運行添加遷移創建遷移SeedOnly

清除掉所有向上()和生成的代碼,如果有任何未決向下()改變

public partial class SeedOnly : DbMigration 
{ 
    public override void Up() 
    { 
    } 

    public override void Down() 
    { 
    } 
} 

然後,你可以通過運行更新數據庫,針對特定遷移-TargetMigration SeedOnly在Package Manager控制檯

+2

我想這是最好的答案。這是驚人的,它有太少upvotes! – ehsan88

0

如果你想Update-Database --Target-Migration xxx和你很驚訝,因爲我是seed()方法尚未運行,你可以嘗試git stash所有更改,使用Update-Database(到它運行seed()總是最後一個版本)產生不同版本的數據庫和然後git stash apply

這是醜陋的解決方法,但它幫助了我。

順便說一句:不要忘了積攢

+0

好的,這是相當醜陋*咧嘴* – tofutim