Подтвердить что ты не робот

DropCreateDatabaseAlways Seed not called

У меня возникла проблема с вызовом метода 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) не вызывается и данные не помещаются в мою базу данных.

4b9b3361

Ответ 1

Ваша база данных будет создана позже, когда вы используете свой контекст или Вы всегда можете заставить его создать, используя свой контекст в методе Application_Start() в Global.asax.cs, например:

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

Ответ 2

В моей ситуации Seed не был вызван, потому что я включил миграцию. Когда я удалял миграцию, он работал. http://entityframework.codeplex.com/workitem/1689

Ответ 3

Метод Seed вызывается, как только вы отправляете первый запрос SQL в свою базу данных, а не в Application_Start. Например:

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