Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF代码先-删除后种子设定,然后创建数据库_Entity Framework_Code First - Fatal编程技术网

Entity framework EF代码先-删除后种子设定,然后创建数据库

Entity framework EF代码先-删除后种子设定,然后创建数据库,entity-framework,code-first,Entity Framework,Code First,我试图强制EF代码首先重新初始化数据库。我的第一个想法是: dbContext.Database.Delete(); dbContext.Database.Create(); 这将创建一个新数据库,但忽略种子策略(使用database.SetInitializer设置)。我在应用程序启动方法中执行上述操作。有什么想法吗 我也尝试过: dbContext.Database.Initialize(true); 一个选项是创建您自己的数据库初始值设定项,该初始值设定项继承自DropCrea

我试图强制EF代码首先重新初始化数据库。我的第一个想法是:

dbContext.Database.Delete();    
dbContext.Database.Create();
这将创建一个新数据库,但忽略种子策略(使用database.SetInitializer设置)。我在应用程序启动方法中执行上述操作。有什么想法吗

我也尝试过:

dbContext.Database.Initialize(true);

一个选项是创建您自己的数据库初始值设定项,该初始值设定项继承自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; }
}
公共类MyInitializer:DropCreateDatabaseAlways
{
受保护的覆盖无效种子(EmployeeContext上下文)
{
Add(newemployee(){FirstName=“Marcy”});
种子(上下文);
}
}
公共类EmployeeContext:DbContext
{
静态EmployeeContext()
{
Database.SetInitializer(新的MyInitializer());//使用我自己的初始值设定项
}
公共IDbSet雇员{get;set;}
}

以下是我为克服这一问题所做的:

  • 在上下文初始值设定项中添加标志

    公共bool WasSeeded=false

  • 在初始值设定项中创建一个公共方法,并将种子代码放在那里。我确保只使用AddOrUpdate或其他upsert方法,即检查数据是否不在数据库中,然后:

    context.Students.AddOrUpdate

  • 最后,将标志设置为true

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

    如果(!initializer.WasSeeded) { 初始值设定项.SeedAndUpsert(上下文); }


  • 你能发布你的Database.SetInitializer代码吗?是的。我已经做过了。但是我不能强迫它运行(不改变模型)
    Database.SetInitializer(new CustomInitializer()); //CustomInitializer contains the overriding Seed method
    
    using (var context = new CustomDatabaseContext())
    {
        context.Database.Initialize(force: true);
    }