我正在尝试强制EF Code First重新初始化数据库。我的第一个想法是打电话:
dbContext.Database.Delete();
dbContext.Database.Create();
这会创建一个新数据库,但会忽略播种策略(使用Database.SetInitializer<>设置)。我正在Application_Start方法中执行上述操作。有什么想法吗?
我也尝试过:
dbContext.Database.Initialize(true);
答案 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)
以下是我为克服这个问题所做的工作:
在您的上下文初始值设定项中添加标记
public bool WasSeeded = false;
在初始化程序中创建一个公共方法,并将种子代码放在那里。我确保只使用AddOrUpdate或其他upsert方法,即检查数据是否在DB之前:
context.Students.AddOrUpdate
最后将标志设置为true
初始化上下文后,检查标志,如果为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);
}