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

时间:2010-09-09 00:20:13

标签: c# .net entity-framework asp.net-mvc-2

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

我目前收到此错误:

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

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

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

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

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

4 个答案:

答案 0 :(得分:9)

更新

我简单地掩饰了你已经拥有一个数据库并且想要创建另一个数据库的事实......在这种情况下,答案是将它放在你的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());

答案 1 :(得分:4)

顺便说一句,从CTP5开始,这是在Global.asax中设置初始值设定项的正确方法

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

答案 2 :(得分:3)

在EF 4.1中

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}

答案 3 :(得分:1)

问题是ADO.NET团队以

创建连接
 connectionBuilder = new SqlConnectionStringBuilder(sqlConnection.ConnectionString)
                {
                    InitialCatalog = "master",
                    AttachDBFilename = string.Empty, 
                };

但是sqlConnection.ConnectionString是应用程序配置文件中指定的纯连接字符串,但没有密码!由于安全原因,我认为......所以打开这样的连接失败< /强>!


我发现唯一可行的解​​决方案是使用集成安全性,这意味着设置连接字符串属性集成安全性= SSPI

我们需要等待有补丁或CTP5; o)