实体框架Database.SetInitializer根本不起作用

时间:2011-06-16 07:36:02

标签: sql-server-2008 asp.net-mvc-3 entity-framework-4.1 ef-code-first code-first

我在这里遇到这种“神秘”问题。 我目前正在使用我的ASP.NET MVC 3应用程序使用Entity Framework 4.1 Code First方法,它工作得很好,直到昨天......

发生了一些非常糟糕的事情导致我的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; }
}

我还设置了自定义初始化程序(用于测试)

public class MyInitializer 
            : DropCreateDatabaseIfModelChanges<MyContext>
{
}

现在我已经在Web.config中设置了连接字符串(名称与MyContext相同) 所以在Global.asax中我在Application_Start()方法中调用这个简单的代码

Database.SetInitializer(new MyInitializer());

但问题是 Database.SetInitializer WONT创建了任何数据库,更糟糕的是,它甚至没有尝试使用来自上下文的表来填充现有数据库... 我试图调试,但似乎应用程序只是跳过数据库初始化代码...

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

var ctx = new MyContext();
ctx.Database.Initialize(true);

所以这里我只是强迫代码创建数据库......

但是,数据库.SetInitializer不会工作的事实真的很烦人......以前工作得很好,我不知道发生了什么。 我查看了windows事件日志,sql server日志......但是什么都没有。只是沉默。 但也许我只是在寻找错误的地方? :S

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

P.S我正在使用Visual Web Developer 2010 + SQL Server Express 2008 R2

4 个答案:

答案 0 :(得分:43)

只有在实际使用上下文时才会创建数据库。

如果您在初始化程序中重写了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();

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

答案 1 :(得分:0)

创建数据库的另一种方法

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

var context = new MyContext();
context.Database.Create();

答案 2 :(得分:0)

在Global.asax.cs

Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, DbMigrationConfig>());

其中DbMigrationConfig是我重命名的迁移文件夹中的Configuration类。 还要确保在config

的构造函数中启用自动迁移

答案 3 :(得分:-1)

我的Code First定义遇到了同样的问题,并将其缩小到一个类文件中定义的多个DBInitializer。因此,在检查语法和用法之后要遵循的拇指规则是:

1)在一个物理文件中只有一个初始化程序定义
2)在单独的文件中定义DbContext和Initializer

HTH

相关问题