EF代码优先 - 删除后再创建数据库

时间:2012-03-13 10:15:57

标签: entity-framework code-first

我正在尝试强制EF Code First重新初始化数据库。我的第一个想法是打电话:

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

这会创建一个新数据库,但会忽略播种策略(使用Database.SetInitializer<>设置)。我正在Application_Start方法中执行上述操作。有什么想法吗?

我也尝试过:

dbContext.Database.Initialize(true);

3 个答案:

答案 0 :(得分:0)

一种选择是创建自己的DatabaseInitializer,它继承自DropCreateDatabaseAlways。

这样的例子就是。

public class MyInitializer : DropCreateDatabaseAlways<EmployeeContext>
{
    protected override void Seed(EmployeeContext context)
    {
        context.Employees.Add(new Employee() {FirstName = "Marcy"});
        base.Seed(context);
    }
}

public class EmployeeContext : DbContext
{
    static EmployeeContext()
    {
        Database.SetInitializer(new MyInitializer()); // using my own initializer
    }

    public IDbSet<Employee> Employees { get; set; }
}

答案 1 :(得分:0)

以下是我为克服这个问题所做的工作:

  1. 在您的上下文初始值设定项中添加标记

    public bool WasSeeded = false;

  2. 在初始化程序中创建一个公共方法,并将种子代码放在那里。我确保只使用AddOrUpdate或其他upsert方法,即检查数据是否在DB之前:

    context.Students.AddOrUpdate

  3. 最后将标志设置为true

    1. 初始化上下文后,检查标志,如果为false,则手动运行逻辑:

      if(!initializer.WasSeeded) {      initializer.SeedAndUpsert(上下文); }

答案 2 :(得分:0)

Database.SetInitializer(new CustomInitializer()); //CustomInitializer contains the overriding Seed method

using (var context = new CustomDatabaseContext())
{
    context.Database.Initialize(force: true);
}