DropCreateDatabaseAlways

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 方法根本没有触发,并且正在使用以前创建的数据库。为什么会发生?我的代码中缺少什么?

最佳答案

这里的问题是在您当前的项目中激活了迁移。与本文 ( http://entityframework.codeplex.com/workitem/1689 ) 相关,不能同时使用迁移 "DropCreateDatabaseAlways"作为初始值设定项。

如果你想使用迁移和“DropCreateDatabaseAlways”(这完全没用,除了测试可能),你必须编写一个自己的 Init() 方法,它在每个应用程序启动时删除和创建你的数据库。

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

但是,如果您停用迁移,则可以使用初始化程序“DropCreateDatabaseAlways”。

如果没有迁移问题仍然存在,这里有一些提示如何解决此类问题:

Initializer 仅在您使用数据库实例或数据库不存在时执行。 seed方法是Initializer的一部分,因此也不会执行。要解决此问题,您可以通过访问部分数据来“处理”数据库,例如:
context.Set<Entity>.Count();

或任何其他适用于数据库的方法。

另一种解决方案是强制数据库调用Initializer:
Database.Initialize(true/false);

希望这可以帮助。

10-05 23:32