EF 代码优先 - 删除然后创建数据库后播种
Posted
技术标签:
【中文标题】EF 代码优先 - 删除然后创建数据库后播种【英文标题】:EF Code First - Seeding after Deleting and then Creating database 【发布时间】:2012-03-13 10:15:57 【问题描述】:我正在尝试强制 EF Code First 重新初始化数据库。我的第一个想法是打电话:
dbContext.Database.Delete();
dbContext.Database.Create();
这将创建一个新数据库,但种子策略(使用 Database.SetInitializer 设置)被忽略。我在 Application_Start 方法中执行上述操作。有什么想法吗?
我也试过了:
dbContext.Database.Initialize(true);
【问题讨论】:
你能发布你的 Database.SetInitializer 代码吗? 【参考方案1】:一种选择是创建您自己的继承自 DropCreateDatabaseAlways 的 DatabaseInitializer。
这方面的一个例子是。
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;
【讨论】:
是的。我已经这样做了。但我不能强迫它运行(不改变模型)。【参考方案2】:这是我为克服这个问题所做的:
在你的上下文初始化器中添加一个标志
public bool WasSeed = false;
在您的初始化程序中创建一个公共方法并将您的种子代码放在那里。我确保只使用 AddOrUpdate 或其他 upsert 方法,即检查数据之前不在数据库中:
context.Students.AddOrUpdate
最后设置标志为真
初始化上下文后,检查标志,如果为假,则手动运行逻辑:
if (!initializer.WasSeed) 初始化器.SeedAndUpsert(上下文);
【讨论】:
【参考方案3】:Database.SetInitializer(new CustomInitializer()); //CustomInitializer contains the overriding Seed method
using (var context = new CustomDatabaseContext())
context.Database.Initialize(force: true);
【讨论】:
以上是关于EF 代码优先 - 删除然后创建数据库后播种的主要内容,如果未能解决你的问题,请参考以下文章