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是我改名爲遷移文件夾中的配置類。 也請確保您啓用配置的構造函數中的自動遷移