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