【问题标题】:EF Code First - Seeding after Deleting and then Creating databaseEF 代码优先 - 删除然后创建数据库后播种
【发布时间】: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 代码吗?

标签: entity-framework code-first


【解决方案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】:

这是我为克服这个问题所做的:

  1. 在你的上下文初始化器中添加一个标志

    public bool WasSeed = false;

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

    context.Students.AddOrUpdate

最后设置标志为真

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

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2013-06-22
      • 2013-05-02
      相关资源
      最近更新 更多