44

如何在應用程序啓動之前或生成數據庫之後處理需要預先存在的數據的情況。例如,我有一個我想在代碼優先生成之後加載到數據庫中的國家列表。我該怎麼做呢?實體框架數據庫中的代碼優先默認數據

應用程序的結構如下:

Repository > Service > WebMVC

XML是在WebMVC項目。

回答

67

您可以創建自定義初始化程序,它繼承自DropCreateDatabaseIfModelChangesDropCreateDatabaseAlways接口。像:

public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<-YourDbContext-> 

然後你覆蓋種子的方法,如:

protected override void Seed(YourDbContext context) 

全例子可能是這樣的:

public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<EntitiesContext> 
{ 
    protected override void Seed(EntitiesContext context) 
    { 
     List<Role> roles = new List<Role> 
     { 
      new Role {Id=1, Title="Admin"}, 
      new Role {Id=2, Title="ProjectManager"}, 
      new Role {Id=3, Title="Developer"} 
     }; 

     // add data into context and save to db 
     foreach (Role r in roles) 
     { 
      context.Roles.Add(r); 
     } 
     context.SaveChanges(); 

    } 
} 

編輯:設置此功能後,您必須設置初始化程序正如Ladislav Mrnka所說的那樣。

Database.SetInitializer(new EntitiesContextInitializer()); 
在Global.asax中

即::

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    Database.SetInitializer(new EntitiesContextInitializer()); 
} 

不要忘記添加using System.Data.Entity; .....

+0

這隻會創建角色列表。您必須將它們添加到上下文並保存更改。 – 2011-04-13 21:35:39

+0

不錯,謝謝你指出。 – Damb 2011-04-13 21:40:32

+0

@Dampe我可以在webUI項目中使用Database.SetInitializer,還是必須在創建DbContext的位置? – 2011-04-13 22:17:43

10

您必須創建自定義數據庫初始值設定項,例如從DropCreateDatabaseIfModelChanges派生並填寫數據,覆蓋Seed方法。然後,您必須在應用程序啓動時使用Database.SetInitializer來設置新的初始化程序。 Here是用於在數據庫中創建自定義索引的示例(來自CTP5)。

+0

因爲我只能使用Web前端的文件訪問代碼,有沒有辦法讓我調用初始化程序或傳遞數據呢? – 2011-04-13 22:16:26

+0

您可以將自定義代碼中的初始化包裝起來,並將數據從web應用程序傳遞到該代碼,然後該代碼將數據傳遞給初始化程序的新實例。 – 2011-04-13 22:29:03

相關問題