实体框架CTP4:在哪里放置SetInitializer?

Cyn*_*hia 6 .net c# entity-framework asp.net-mvc-2

我试图使用CTP4预览将实体框架(代码优先)添加到使用测试数据运行的MVC应用程序.

我目前收到此错误:

自创建数据库以来,支持"SchedulerContext"上下文的模型已更改.手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer.例如,RecreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定.

我根本不想生成数据库,因为我已经有了一个数据库.所以我尝试将以下内容添加到SchedulerContext构造函数中:

Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());
Run Code Online (Sandbox Code Playgroud)

它完全没有效果 - 下次运行时我得到了同样的错误.当它执行访问数据库的LINQ语句时,似乎发生了错误 - 我认为第一个.

我应该把这个陈述放在哪里,或者这个陈述是否是这个问题的答案?

Bui*_*ted 9

更新

我只是掩饰你已经有一个数据库和事实希望创建一个又一个......在这种情况下,答案是把这个在您的SchedulerContext类

protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) {
    modelBuilder.IncludeMetadataInDatabase = false;
}
Run Code Online (Sandbox Code Playgroud)

老答案

您通常将它放在Global.asax中

protected void Application_Start() {
    Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());
}
Run Code Online (Sandbox Code Playgroud)

请注意,它仅在首次使用数据上下文时初始化.

更新

public class DataContextInitializer : CreateDatabaseOnlyIfNotExists<SchedulerContext> {
    protected override void Seed(SchedulerContext context) {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样修改SetInitializer.

System.Data.Entity.Infrastructure.Database.SetInitializer<SchedulerContext>(new  DataContextInitializer());
Run Code Online (Sandbox Code Playgroud)