我在这里遇到这样的“神秘”问题。
我目前正在使用我的ASP.NET MVC 3应用程序的Entity Framework 4.1 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创建任何数据库,甚至更糟糕的是,甚至还没有尝试使用来自上下文的表中的FILL现有数据库
我试图调试,但似乎应用程序只是跳过数据库初始化代码…
var ctx = new MyContext(); ctx.Database.Initialize(true);
但事实上Database.SetInitializer不会工作真的很烦人…以前工作很好,我不知道发生了什么。
我查看了windows事件日志,sql server logs …但没有任何内容。只是沉默
但也许我只是在错误的地方看? :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();