16

我在这里有这种“神秘”的问题。 我目前正在使用实体框架4.1代码优先的方法与我的ASP.NET MVC 3应用程序,它工作得很好,直到昨天...实体框架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相同) 所以在Global.asax中我打电话的Application_Start这个简单的代码()方法

Database.SetInitializer(new MyInitializer()); 

但问题是,Database.SetInitializer不会产生任何数据库,甚至更糟的是,它也甚至没有试图填补现有的数据库从上下文表... 我试图调试,但它似乎是应用程序只是跳过数据库的初始化代码...

我找到了一个解决办法,就是用这行代码

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

所以在这里,我只是强制代码来创建DB无论如何...

但事实Database.SetInitializer不会工作真的很烦人......它以前工作得很好,我不知道发生了什么事。 我看着Windows事件日记,SQL服务器日志...但没有任何东西。只是沉默。 但也许我只是看错了地方? :S

有人可以告诉我发生了什么事吗?

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

回答

42

当你实际使用的情况下对数据库才会被创建。

如果你已经覆盖在你的初始种子的方法如下:当您使用MyContext的实例

protected override void Seed(MyContext context){...} 

的种子代码才会运行。

这就是为什么它的工作原理,当你使用

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(); 

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

+0

是的,它的工作....谢谢。我真的忘了所有那些“懒加载”的东西。 :) – geCoder 2011-06-16 08:00:56

0

另一种方式来创建数据库

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

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

我有我的代码首先定义了同样的问题,并把范围缩小到一个类文件中定义多个DBInitializer。因此拇指规则检查语法和用法后,遵循的是:

1)有一个物理文件
2)定义的DbContext和初始化程序在不同的文件只有一个初始化函数定义

HTH

0

在Global.asax.cs中

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

其中DbMigrationConfig是我改名为迁移文件夹中的配置类。 也请确保您启用配置的构造函数中的自动迁移