15

自從4.1(現在我在4.3上)以來,我一直在爲這個問題而掙扎。在我看來,要獲得被稱爲種子的方法,都是我應該做的是:未使用EntityFramework調用的種子方法CodeFirst

1)創建於SQLSERVER 2空數據目錄)執行下面的代碼:

Database.SetInitializer(new DropCreateDatabaseAlways<SiteDB>()); 

我有我的SiteDB定義如下:

public class SiteDBInitializer : 
    DropCreateDatabaseAlways<SiteDB> 
{ 
    protected override void Seed(SiteDB db) 
    { 
      ... (break point set here that never gets hit) 

我覺得我必須失去了一些東西很簡單,因爲這造成我的表,但永遠不會調用種子的方法。

爲了更清楚地說明,下面是一個包含所有代碼的完整示例。當我運行它時,種子永遠不會被調用:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Text; 
using System.Data.Entity; 

namespace ConApp 
{ 
internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     Database.SetInitializer(new SiteDBInitializer()); 
     using (var db = new SiteDB()) 
     { 
      var x = db.Customers; 
     } 
    } 
} 

public class SiteDB : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 
} 

public class Customer 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    public string LastName { get; set; } 
} 

public class SiteDBInitializer : 
    DropCreateDatabaseAlways<SiteDB> 
{ 
    protected override void Seed(SiteDB db) 
    { 
     db.Customers.Add(new Customer() {LastName = "Kellner"}); 
     db.Customers.Add(new Customer() {LastName = "Jones"}); 
     db.Customers.Add(new Customer() {LastName = "Smith"}); 
     db.SaveChanges(); 
    } 
} 

} 

回答

8

您需要致電Database.SetInitializer(new SiteDBInitializer());來代替。

+1

我假設你的意思是:Database.SetInitializer(new SiteDBInitializer());我試過了,也沒有奏效。 – 2012-02-17 03:28:51

+1

@PeterKellner當你第一次做某事(例如查詢)時會被調用。你嘗試執行查詢嗎? – Eranga 2012-02-17 03:44:28

+0

嗨Eranga和J.W.我已經更新了我的問題,以包含一個簡單的控制檯應用程序,我相信種子應該被調用,而不是。如果你可以看看(甚至粘貼並運行它),我真的很感激它。我敢肯定,我錯過了一些簡單的東西,但幾個月來它一直在瘋狂。 – 2012-02-17 05:06:25

0

我看了所有的答案,沒有什麼真正的工作,我不知道這是一個微軟的錯誤,因爲當數據庫不存在時不調用Seed方法。 奏效的唯一代碼,是實際上使類調用的種子,如果DB不存在:

Context類:

class AlisDbContext : DbContext 
{ 
    public class MyContextFactory : IDbContextFactory<AlisDbContext> 
    { 
     public AlisDbContext Create() 
     { 
      return new AlisDbContext("CompactDBContext"); 
     } 
    } 

    public AlisDbContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
     Database.SetInitializer(new AlisDbInitializer(this)); 
     Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AlisDbContext>()); 
    } 

    public DbSet<SavedCredentials> SavedCredentialses { get; set; } 
} 

然後AlisDbInitializer需要檢查並呼籲像種子方法:

public AlisDbInitializer(AlisDbContext alisDbContext) 
    { 
     if (!alisDbContext.Database.Exists()) 
     { 
      Seed(alisDbContext); 
     }   
    }