Code First Database Initializer никогда не вызывается после обновления до MVC 4

У меня сегодня утром странная проблема.

Я следовал этому совету: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application ...

... о том, как сначала реализовать код в своих проектах. Я сделал тот же урок 2 недели назад, и все работало отлично. С тех пор я внес некоторые изменения и обновился до MVC 4, и теперь Code First перестал работать.

Я пробовал те же учебные пособия, с тем же шагом, который я делал раньше в веб-приложении MVC3, удалял базу данных, повторно воссоздавал ее и метод «Seed» или «OnModelCreating» в DAL, похоже, не больше не звонил.

У меня есть Database.SetInitializer(new AppInitializer()); В моем Application_Start(), который вызывается, но после этого ничего не происходит.

Кто-нибудь знает, почему это могло внезапно перестать работать? МВК4?

Спасибо!


person iPeo    schedule 09.04.2012    source источник


Ответы (4)


Когда контекст изменится, вы можете либо удалить базу данных и создать ее вручную, что я не думаю, что вы захотите это сделать, если используете подход EF Code First, либо вы можете использовать то, что вы сказали, вызывая метод Database.SetInitializer() при запуске вашего приложения.

protected void Application_Start() {
    DbDatabase.SetInitializer(new 
        DropCreateDatabaseIfModelChanges<MyApp.Models.MyContext>());
    // ...
}

Что касается метода Seed(), вот как я бы это сделал

public class MyContextInitializer :
    DropCreateDatabaseIfModelChanges <MyApp.Models.MyContext>
{
    protected override void Seed(MyApp.Models.MyContext context)
        {
            base.Seed(context);

            context.Tags.Add(new Tag
            {
                    Name = ".NET",
                    Description = "Microsoft's .NET language related"
            });

            context.SaveChanges();
        }
}

Как только вы это сделаете, вы можете изменить вызов метода DbDatabase.SetInitializer() следующим образом:

protected void Application_Start() {
    DbDatabase.SetInitializer(new MyContextInitializer());
    // ...
}

Обратите внимание, что вы можете использовать свой класс, пока он реализует IDatabaseInitializer.

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

person Esteban    schedule 09.04.2012

Что могло случиться, так это то, что вы запустили приложение в первый раз без вызова Database.SetInitializer(...). На данный момент база данных была создана. Но поскольку вы не вносили никаких изменений в базу данных модели, ее не нужно создавать или инициализировать — метод override void Seed(...) в INITIALIZER не вызывается.

Попробуйте внести фиктивные изменения в вашу модель и проверьте, работает ли она.

Обратите внимание, что override void OnModelCreating(...) вызывается при первом доступе к вашему контексту данных. Поэтому, когда ваша домашняя страница не имеет доступа к базе данных, вы должны вручную перейти на ту же страницу, которая имеет доступ.

person vajanko    schedule 25.03.2014

У меня была такая же проблема, когда я создал новый проект MVC4. Оказалось, потому что InitializeSimpleMembershipAttribute звонит Database.SetInitializer<UsersContext>(null);. Поищите другие вызовы InitializeSimpleMembershipAttribute в вашем проекте, которые вам не принадлежат...

person Rob Fonseca-Ensor    schedule 14.11.2012

Вы пытались преобразовать свой рабочий проект MVC 3 в MVC 4/Beta или создали новый проект MVC 4/Beta и следовали инструкциям? Для Бета-версия MVC 4. Введение в ASP.NET MVC и Введение в бета-версию ASP.NET MVC 4 с бета-версией Visual Studio 11 Я начал с нуля. Вам придется выполнить некоторую отладку, чтобы увидеть, что вы сделали неправильно, MVC 4/Beta не нарушает EF. Я надеюсь обновить отличный учебник Тома по EF/MVC до MVC 4 около 4 июля 2012 г.

person RickAndMSFT    schedule 10.04.2012
comment
Я не думаю, что это вообще отвечает на вопрос. У меня такая же проблема. - person Danation; 08.09.2012