Базы Данных.SetInitializer просто не работает

у меня здесь такая "таинственная" проблема. В настоящее время я использую Entity Framework 4.1 Code First approach с моим ASP.NET приложение MVC 3, оно отлично работало до вчерашнего дня...

что-то действительно плохое случилось, что вызвало мою базу данных.SetInitializer для остановки работы. Объяснил:

у меня есть эта простая модель

public class User
{
    public int Id { get; set; }
    public int RoleId { get; set; }

    [Required]
    [StringLength(50)]
    [DataType(DataType.Text)]
    public string Login { get; set; }

    [Required]
    [StringLength(150)]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Required]
    [StringLength(32)]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime RegisteredDate { get; set; }

    public virtual Role Role { get; set; }
}

и вот мой DbContext

public class MyContext : DbContext
{
    public DbSet<Models.User> Users { get; set; }
}

также я настраиваю пользовательский инициализатор (для тест)

public class MyInitializer 
            : DropCreateDatabaseIfModelChanges<MyContext>
{
}

теперь я уже настроил строку подключения в Интернете.config (с именем таким же, как MyContext) Так в глобальном.asax я вызываю этот простой код в методе Application_Start ()

Database.SetInitializer(new MyInitializer());

но проблема в том, что

4 ответов


база данных будет создана только тогда, когда вы фактически используете контекст.

Если вы переопределили метод Seed в своем инициализаторе следующим образом:

protected override void Seed(MyContext context){...}

начальный код будет выполняться только при использовании экземпляра MyContext.

вот почему он работает, когда вы используете

var ctx = new MyContext();
ctx.Database.Initialize(true);

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

        System.Data.Entity.Database.SetInitializer(new MyInitializer());

        MyContext db = new MyContext();
        db.Database.Initialize(true);
        //or even something like db.Users.Count();

или это будет созданный позже, когда вы используете свой контекст. Может показаться, что он перестал работать, потому что вы удалили код, который будет использовать контекст при запуске приложения.


другой способ создания базы данных

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

var context = new MyContext();
context.Database.Create();

в мировой.асакс.cs

Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, DbMigrationConfig>());

где DbMigrationConfig - класс конфигурации в папке миграции, которую я переименовал. Также убедитесь, что вы включили автоматическую миграцию в конструкторе config


У меня была такая же проблема с моими определениями кода First и сузила ее до нескольких DBInitializer, определенных в одном файле класса. Таким образом, правило thumb следовать после проверки синтаксиса и использования:

1) иметь только одно определение инициализатора в одном физическом файле
2) Определите DbContext и инициализатор в отдельных файлах

HTH