我在这里遇到这种“神秘”问题。
我目前在我的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);


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

但是,Database.SetInitializer无法正常工作的事实确实令人讨厌……它在以前非常有效,我不知道发生了什么。
我查看了Windows事件日志,SQL Server日志...,但是什么都没有。只是沉默。
但是也许我只是在错误的地方看? :S

谁能告诉我发生了什么事?

我正在使用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();


否则将在以后使用上下文时创建。由于您删除了一些将在应用程序启动时使用上下文的代码,因此它似乎已停止工作。

关于sql-server-2008 - Entity Framework Database.SetInitializer根本不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6368553/

10-11 05:21