2012-03-13 139 views
5

我试图强制EF代码优先重新初始化数据库。我的第一个想法就是要呼吁:EF代码优先 - 删除后创建数据库然后创建数据库

dbContext.Database.Delete();  
dbContext.Database.Create(); 

这将创建一个新的数据库,但接种策略被忽略(>设置使用Database.SetInitializer <)。我在Application_Start方法中执行上述操作。有任何想法吗?

我也曾尝试:

dbContext.Database.Initialize(true); 
+0

您可以发布您Database.SetInitializer <>代码? – 2012-03-18 23:06:21

回答

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; } 
} 
+0

是的。我已经做到了。但我不能强迫它运行(不改变模型)。 – 2012-03-29 14:26:49

0

这里就是我所做的解决此问题:

  1. 添加标记在上下文初始化

    公共BOOL WasSeeded = FALSE;

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

    context.Students.AddOrUpdate

在结束时,标志设置为true

  1. 后您初始化的背景下,检查该标志,如果是假的手动运行逻辑:

    如果 {(initializer.WasSeeded!)initializer.SeedAndUpsert(context); }

0
Database.SetInitializer(new CustomInitializer()); //CustomInitializer contains the overriding Seed method 

using (var context = new CustomDatabaseContext()) 
{ 
    context.Database.Initialize(force: true); 
} 
相关问题