geC*_*der 16 code-first sql-server-2008 ef-code-first entity-framework-4.1 asp.net-mvc-3
我在这里遇到这种"神秘"问题.我目前正在使用我的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; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的DbContext
public class MyContext : DbContext
{
public DbSet<Models.User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我也设置了自定义初始化程序(用于测试)
public class MyInitializer
: DropCreateDatabaseIfModelChanges<MyContext>
{
}
Run Code Online (Sandbox Code Playgroud)
现在我已经在Web.config中设置了连接字符串(名称与MyContext相同)所以在Global.asax中我在Application_Start()方法中调用这个简单的代码
Database.SetInitializer(new MyInitializer());
Run Code Online (Sandbox Code Playgroud)
但问题是Database.SetInitializer WONT创建了任何数据库,更糟糕的是,它甚至没有尝试使用来自上下文的表来填充现有数据库...我试图调试,但似乎应用程序只是跳过数据库初始化代码...
我找到了一个解决方案,就是使用这行代码
var ctx = new MyContext();
ctx.Database.Initialize(true);
Run Code Online (Sandbox Code Playgroud)
所以在这里我只是强迫代码创建数据库...
但是Database.SetInitializer不会工作的事实真的很烦人......以前工作得很好,我不知道发生了什么.我查看了windows事件日志,sql server日志......但是什么都没有.只是沉默.但也许我只是在寻找错误的地方?:S
谁能告诉我发生了什么事?
PS我正在使用Visual Web Developer 2010 + SQL Server Express 2008 R2
wog*_*les 43
只有在实际使用上下文时才会创建数据库.
如果您在初始化程序中重写了Seed方法,如下所示:
protected override void Seed(MyContext context){...}
Run Code Online (Sandbox Code Playgroud)
Seed代码仅在您使用MyContext的实例时运行.
这就是为什么它在你使用时有效
var ctx = new MyContext();
ctx.Database.Initialize(true);
Run Code Online (Sandbox Code Playgroud)
您可以始终通过在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();
Run Code Online (Sandbox Code Playgroud)
或者稍后在您使用上下文时创建它.它可能看起来已停止工作,因为您删除了一些将在应用程序启动时使用上下文的代码.
| 归档时间: |
|
| 查看次数: |
28048 次 |
| 最近记录: |