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 代码优先 - 删除然后创建数据库后播种的主要内容,如果未能解决你的问题,请参考以下文章

EF6 使用列默认值创建代码优先表

EF之Code First代码优先

用于一对零或一关系的实体框架 (EF) 代码优先级联删除

EF 代码优先数据库/表初始化 - 何时发生?

EF 代码优先:如何在遵循 DDD 时从实体的集合中删除一行?

NHibernate 和代码优先