2015-11-26 65 views
2

我想用EF代碼優先建立一個基於WPF數據庫的應用程序。我有一個不產生數據庫的問題,我試圖解決這樣的:C#實體框架沒有初始化數據庫

using (var db = new MyDBContext()) 
{ 
    db.Database.Initialize(true); 
} 

我插在App.xamls.cs這個代碼,重寫OnStartup方法(這工作)。

然後我試圖種子一些默認的數據是這樣的:

public class MyDBContextSeeder : DropCreateDatabaseAlways<MyDBContext> 
{ 
    protected override void Seed(MyDBContext context) 
    { 
     IList<Dog> defaultDog = new List<Dog>(); 
     defaultDog.Add(new Dog("Spike")); 

     foreach (Dog d in defaultDog) 
      context.Dogs.Add(d); 

     // more data here.... 

     base.Seed(context); 
    } 
} 

而且,由於我使用的是自定義的初始化,我已經改變了我的第一個代碼上面是這樣的:

using (var db = new PizzeriaDBContext()) 
{ 
    new MyDBContextSeeder().InitializeDatabase(db); //this line 
    db.Database.Initialize(true); 
} 
現在

的問題是:

  • 當我建立我的應用我的默認數據未插入。我很確定。

  • ,如果我再次嘗試建立我的申請,我有這樣的例外:

    狗實體已經在數據庫中。

遷移已啓用。

我已經嘗試刪除db.Database.Initialize(true),但是當我這樣做時,我的數據庫甚至沒有創建。

+0

你做一個Add-遷移或已啓用自動遷移?種子方法僅在遷移時運行。 – mrsargent

+0

@mrsargent是否指在控制檯中鍵入Add-Migration時生成的'InitialCreate:DbMigration'類?如果是這樣,是的。並且'Configuration.cs'中也有'AutomaticMigrationsEnabled = true;' – Koosshh56

+0

什麼是數據庫連接字符串? '如果我試圖再次構建我的應用程序,我有一個異常,如:狗實體已經在數據庫中'看起來像我正在進入你不期望的地方。 – teynon

回答

0

默認情況下,您的數據庫正在使用CreateDatabaseIfNotExits初始值設定項。這就是爲什麼你會得到你的例外。所以,我認爲你需要做的是以下幾點:

在您被覆蓋的OnStartup可以使用

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext,Configuration>) 

對於這個工作,你需要從內部密封公共更改Configuration.cs類

僅供參考,你可以看一下這篇文章的最底部 MigrateDatabaseToLatestVersion

+0

它給我一個代碼上的錯誤:下劃線配置並且說它不存在 – Koosshh56

+0

並且您將配置類從內部密封更改爲公共? – mrsargent

+0

是的,我修好了,別擔心。但是,我是否必須在'使用(var db = new MyDBContext()) { }'內部添加這部分'並替換我已經擁有的代碼? – Koosshh56