實體框架CTP4:在哪裡放置SetInitializer?

.net asp.net-mvc-2 c# entity-framework

我試圖使用CTP4預覽將實體框架(代碼優先)添加到使用測試數據運行的MVC應用程序。

我目前收到此錯誤:

自創建數據庫以來,支持“SchedulerContext”上下文的模型已更改。手動刪除/更新數據庫,或使用IDatabaseInitializer實例調用Database.SetInitializer。例如,RecreateDatabaseIfModelChanges策略將自動刪除並重新創建數據庫,並可選擇使用新數據對其進行種子設定。

我根本不想生成數據庫,因為我已經有了一個數據庫。所以我嘗試將以下內容添加到SchedulerContext構造函數中:

Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());

它完全沒有效果 - 下次運行時我得到了同樣的錯誤。當它執行訪問數據庫的LINQ語句時,似乎發生了錯誤 - 我認為第一個。

我應該把這個陳述放在哪裡,或者這個陳述是否是這個問題的答案?

一般承認的答案

更新

我只是掩飾你已經有一個數據庫, 不想再創建一個事實......在這種情況下,答案是把這個在您的SchedulerContext類

protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) {
    modelBuilder.IncludeMetadataInDatabase = false;
}

老答案

您通常將它放在Global.asax中

protected void Application_Start() {
    Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());
}

請注意,它僅在首次使用數據上下文時初始化。

更新

public class DataContextInitializer : CreateDatabaseOnlyIfNotExists<SchedulerContext> {
    protected override void Seed(SchedulerContext context) {
    }
}

然後像這樣修改SetInitializer。

System.Data.Entity.Infrastructure.Database.SetInitializer<SchedulerContext>(new  DataContextInitializer());

熱門答案

順便說一句,從CTP5開始,這是在Global.asax中設置初始化程序的正確方法

protected void Application_Start() { System.Data.Entity.Database.DbDatabase.SetInitializer<NerdDinners>(new System.Data.Entity.Database.DropCreateDatabaseIfModelChanges<NerdDinners>()); }



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因