如何在應用程序啓動之前或生成數據庫之後處理需要預先存在的數據的情況。例如,我有一個我想在代碼優先生成之後加載到數據庫中的國家列表。我該怎麼做呢?實體框架數據庫中的代碼優先默認數據
應用程序的結構如下:
Repository > Service > WebMVC
XML是在WebMVC
項目。
如何在應用程序啓動之前或生成數據庫之後處理需要預先存在的數據的情況。例如,我有一個我想在代碼優先生成之後加載到數據庫中的國家列表。我該怎麼做呢?實體框架數據庫中的代碼優先默認數據
應用程序的結構如下:
Repository > Service > WebMVC
XML是在WebMVC
項目。
您可以創建自定義初始化程序,它繼承自DropCreateDatabaseIfModelChanges
或DropCreateDatabaseAlways
接口。像:
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;
.....
您必須創建自定義數據庫初始值設定項,例如從DropCreateDatabaseIfModelChanges
派生並填寫數據,覆蓋Seed
方法。然後,您必須在應用程序啓動時使用Database.SetInitializer
來設置新的初始化程序。 Here是用於在數據庫中創建自定義索引的示例(來自CTP5)。
因爲我只能使用Web前端的文件訪問代碼,有沒有辦法讓我調用初始化程序或傳遞數據呢? – 2011-04-13 22:16:26
您可以將自定義代碼中的初始化包裝起來,並將數據從web應用程序傳遞到該代碼,然後該代碼將數據傳遞給初始化程序的新實例。 – 2011-04-13 22:29:03
舉一個例子看到新的MVC /實體框架教程系列 http://www.asp.net/entity-framework/tutorials#Using%20MVC #1和#4都顯示初始化程序類。
這隻會創建角色列表。您必須將它們添加到上下文並保存更改。 – 2011-04-13 21:35:39
不錯,謝謝你指出。 – Damb 2011-04-13 21:40:32
@Dampe我可以在webUI項目中使用Database.SetInitializer,還是必須在創建DbContext的位置? – 2011-04-13 22:17:43