2012-03-13 142 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); 
} 
相關問題