sql-server-2008 – 实体框架Database.SetInitializer根本不工作
|
我在这里遇到这样的“神秘”问题。
事情真的很糟糕,导致我的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相同) Database.SetInitializer(new MyInitializer()); 但问题是Database.SetInitializer WONT创建任何数据库,甚至更糟糕的是,甚至还没有尝试使用来自上下文的表中的FILL现有数据库 我发现一个解决方案,就是使用这一行代码 var ctx = new MyContext(); ctx.Database.Initialize(true); 所以在这里我只是强制代码创建数据库… 但事实上Database.SetInitializer不会工作真的很烦人…以前工作很好,我不知道发生了什么。 有人可以告诉我发生了什么吗? 我正在使用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();
或者当您使用上下文时,将会创建它。它可能看起来已经停止工作,因为您删除了一些将在应用程序启动时使用上下文的代码。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
