DropCreateDatabaseAlways种子未调用

时间:2013-01-09 17:14:21

标签: c# .net asp.net-mvc entity-framework

我在使用自定义数据库初始化程序调用Seed方法时遇到问题。我正在使用EF 5.0并具有以下代码:

public static class MyDatabase
{
    public static void Initialize()
    {
        Database.SetInitializer(new MyInitializer());
    }
}

public class MyInitializer : DropCreateDatabaseAlways<MyContext>
{
    protected override void Seed(MyContext context)
    {
        base.Seed(context);
        context.Roles.Add(new Role
        {
            ID = 1,
            Name = "User",
        });
        context.Roles.Add(new Role
        {
            ID = 2,
            Name = "Admin",
        });
        context.SaveChanges();
    }
}

这两个类存在于与MVC应用程序不同的类库中。在Global.asax中,我调用Initialize()方法:

MyDatabase.Initialize();

数据库创建得很好,只是没有调用Seed(MyContext context)方法,没有数据放入我的数据库。

3 个答案:

答案 0 :(得分:13)

您的数据库将在以后使用您的上下文或时创建 您总是可以通过在Global.asax.cs中的Application_Start()方法中使用您的上下文来强制创建它,如:

  System.Data.Entity.Database.SetInitializer(new MyInitializer());
MyContext db = new MyContext();
db.Database.Initialize(true);

答案 1 :(得分:3)

在我的情况下,没有调用Seed,因为我启用了迁移。当我删除迁移时,它有效。 http://entityframework.codeplex.com/workitem/1689

答案 2 :(得分:1)

将第一个SQL查询发送到数据库后,将调用Seed方法,而不是Application_Start。例如:

using (var ctx = new MyContext())
{
    var rolesCount = ctx.Roles.Count(); // should return 2
}