Sql server 2008 Entity Framework Database.SetInitializer根本不工作

Sql server 2008 Entity Framework Database.SetInitializer根本不工作,sql-server-2008,asp.net-mvc-3,entity-framework-4.1,ef-code-first,code-first,Sql Server 2008,Asp.net Mvc 3,Entity Framework 4.1,Ef Code First,Code First,我这里有这样一个“神秘”的问题。 我目前在ASP.NET MVC 3应用程序中使用Entity Framework 4.1代码优先的方法,它工作得很好,直到昨天 发生了一件非常糟糕的事情,导致我的Database.SetInitializer停止工作。 解释: 我有这个简单的模型 public class User { public int Id { get; set; } public int RoleId { get; set; } [Required] [

我这里有这样一个“神秘”的问题。 我目前在ASP.NET MVC 3应用程序中使用Entity Framework 4.1代码优先的方法,它工作得很好,直到昨天

发生了一件非常糟糕的事情,导致我的Database.SetInitializer停止工作。 解释:

我有这个简单的模型

public class User
{
    public int Id { get; set; }
    public int RoleId { get; set; }

    [Required]
    [StringLength(50)]
    [DataType(DataType.Text)]
    public string Login { get; set; }

    [Required]
    [StringLength(150)]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Required]
    [StringLength(32)]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime RegisteredDate { get; set; }

    public virtual Role Role { get; set; }
}
这是我的DbContext

public class MyContext : DbContext
{
    public DbSet<Models.User> Users { get; set; }
}
但问题是Database.SetInitializer不会创建任何数据库,更糟糕的是,它甚至不会尝试用上下文中的表填充现有数据库。。。 我试着调试,但看起来应用程序只是跳过了数据库初始化代码

我发现了一个解决方案,就是使用这行代码

var ctx = new MyContext();
ctx.Database.Initialize(true);
所以这里我只是强制代码创建DB

但是事实上Database.SetInitializer不能工作真的很烦人。。。以前效果很好,我不知道发生了什么。 我查看了windows事件日志、sql server日志。。。但是什么都没有。只是沉默。 但也许我只是找错地方了

有人能告诉我发生了什么事吗


注:我使用的是Visual Web Developer 2010+SQL Server Express 2008 R2,只有在实际使用上下文时才会创建数据库

如果您在初始值设定项中重写了Seed方法,如下所示:

protected override void Seed(MyContext context){...}
种子代码仅在使用MyContext实例时运行

这就是为什么当你使用

var ctx = new MyContext();
ctx.Database.Initialize(true);
您可以通过在Global.asax.cs中的Application_Start()方法中使用您的上下文来强制创建它,如:

        System.Data.Entity.Database.SetInitializer(new MyInitializer());

        MyContext db = new MyContext();
        db.Database.Initialize(true);
        //or even something like db.Users.Count();

或者,它将在以后使用上下文时创建。它可能看起来已经停止工作了,因为您删除了一些在应用程序启动时使用上下文的代码

创建数据库的另一种方法

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

var context = new MyContext();
context.Database.Create();
Database.SetInitializer(新的CreateDatabaseIfNotExists());
var context=new MyContext();
context.Database.Create();

我的代码优先定义也有同样的问题,并将其缩小到一个类文件中定义的多个DBInitializer。因此,检查语法和用法后要遵循的经验法则是:

1) 在一个物理文件中只有一个初始值设定项定义
2) 在单独的文件中定义DbContext和初始值设定项

HTH

在Global.asax.cs中

Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, DbMigrationConfig>());
Database.SetInitializer(新的MigrateDatabaseToLatestVersion());
其中dbmigtionconfig是我重命名的migrations文件夹中的配置类。
还要确保在配置的构造函数中启用自动迁移

是的,它可以工作。。。。非常感谢。我真的忘了那些“懒散加载”的东西
Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

var context = new MyContext();
context.Database.Create();
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, DbMigrationConfig>());