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); 
     }   
    }