Entity Framework Database. SetInitializer просто не работает - PullRequest
16 голосов
/ 16 июня 2011

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

Произошло что-то действительно плохое, из-за чего мой Database.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>
{
}

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

Database.SetInitializer(new MyInitializer());

Но проблема Database.SetInitializer НЕ БУДЕТ создавать какую-либо базу данных, и что еще хуже, она даже не пытается заполнить существующую базу данных таблицами из контекста ... Я пытался отладить, но кажется, что приложение просто перепрыгивает черезкод инициализации базы данных ...

Я нашел одно решение - использовать эту строку кода

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

Так что здесь я просто заставляю код создавать БД в любом случае ...

Но тот факт, что Database.SetInitializer не работает, действительно раздражает ... раньше он работал великолепно, я не знаю, что случилось.Я посмотрел в журнале событий Windows, журналы SQL Server ... но ничего там нет.Просто тишина.Но, может быть, я просто смотрю не в том месте?: S

Может кто-нибудь сказать мне, что происходит?

PS Я использую Visual Web Developer 2010 + SQL Server Express 2008 R2

Ответы [ 4 ]

43 голосов
/ 16 июня 2011

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 19 апреля 2016

В Global.asax.cs

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

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

0 голосов
/ 14 января 2014

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

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

НТН

0 голосов
/ 02 февраля 2013

Еще один способ создания базы данных

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

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