使用Entity Framework Code First调用种子方法

时间:2012-02-17 02:57:15

标签: entity-framework entity-framework-4 ef-code-first code-first

自从4.1(现在我在4.3)以来,我一直在努力解决这个问题。在我看来,要调用种子方法,我应该做的就是以下内容:

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

}

2 个答案:

答案 0 :(得分:8)

您需要致电Database.SetInitializer(new SiteDBInitializer());

答案 1 :(得分:0)

我查看了所有的答案,没有什么真正有效,我想知道如果DB不存在则不会调用Seed方法的微软错误。 唯一有效的代码是,如果DB不存在,实际上是让类调用种子:

上下文类:

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