Код EF первый DropCreateDatabaseAlways не выполняется

У меня есть тестовое приложение, где я хотел бы удалить и повторно создать базу данных каждый раз, когда я запустить приложение. Это мой класс контекста:

public class MySolutionContext : DbContext
{
    public MySolutionContext()
        : base("MySolution")
    {
        Database.SetInitializer<MySolutionContext>(new DropCreateDatabaseAlways());
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderItem> OrderITems { get; set; }


    public void Seed(MySolutionContext context)
    {

        var order1 = new Order
        {
            Archive = false,
            CompletionDate = DateTime.Now,
            Person = "Bartosz"
        };
        var order2 = new Order
        {
            Archive = false,
            CompletionDate = DateTime.Now,
            Person = "Anna"
        };
        context.Orders.Add(order1);
        context.Orders.Add(order2);

        context.SaveChanges();
    }

    public class DropCreateDatabaseAlways : DropCreateDatabaseAlways<MySolutionContext>
    {
        protected override void Seed(MySolutionContext context)
        {
            context.Seed(context);
            base.Seed(context);
        }
    }
}

когда я запускаю приложение в первый раз, выполняется метод Seed и создается база данных. Однако, когда я останавливаю и перезапускаю приложение, метод Seed вообще не запускается и используется ранее созданная база данных. Почему это происходит? Чего мне не хватает в моем коде?

2 ответов


проблема здесь в том, что миграция активируется в вашем текущем проекте. Связанные с этой статьей (http://entityframework.codeplex.com/workitem/1689), невозможно использовать миграцию и "DropCreateDatabaseAlways" в качестве инициализатора одновременно.

Если вы хотите использовать миграцию и " DropCreateDatabaseAlways "(что совершенно бесполезно, за исключением тестирования, возможно), вам придется написать собственный метод Init (), который удаляет и создает базы данных при каждом запуске приложения.

Database.Delete();
Database.Create();

но если вы деактивируете миграцию, вы можете использовать инициализатор "DropCreateDatabaseAlways".

Если проблема все еще существует без миграции, вот несколько советов, как решить эту проблему:

инициализатор выполняется только если вы используете экземпляр базы данных или если база данных не существует. Метод seed является частью вашего инициализатора, поэтому он также не выполняется. Фиксировать эта проблема вы можете "работать" с базой данных, обращаясь к части данных, таких как:

context.Set<Entity>.Count(); 

или любой другой метод, который работает с базой данных.

другое решение-заставить базу данных вызвать инициализатор:

Database.Initialize(true/false);

надеюсь, что это помогает.


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

просто добавить следующую строку было недостаточно:

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

я подправил его с этим:

Database.SetInitializer(new DropCreateDatabaseAlways<ApsContext>());

using (MyContext context = new MyContext())
{
    context.Database.Delete();
}

важно знать, что, если миграция включена, нужно обратиться к базе данных для создания схемы. Я просто вызываю объект, пытающийся найти что-то с Id = 0 (поэтому он ничего не возвращает).