Entity Framework 4.1 Code First (3)
這篇說明Code First 產生 db schema 及data的方法
在進入主題之前,先報告一件事,就是日前Entity Framework 4.1 RTW 已Release,算是正式版了,看來只有一項功能與RC版不同。
另外ASP.NET MVC 3 有update ,稱之為ASP.NET MVC 3 Tools Update,Phil Haack blog 有介紹,功能上的改變大家可以安裝完去試驗看看。
不過其中有一提到一點 Includes EF Code First 4.1 as a pre-installed NuGet package. ,新增ASP.NET MVC專案,會加入Entity Frameowrk 4.1 相關的dll,雖然我不知道ASP.NET MVC團隊的想法,但總是好事一件。
接下來進入主題
前面2篇的範例都是用已存在的Database 來說明,這篇來看看從code 來產生Database schema 與data
code first 有提供數個class 來產生db schema,都是繼承IDatabaseInitializer<TContext> interface, 我在此用的是DropCreateDatabaseIfModelChanges,看名稱就知道,當Entity Model有變更時,就重建Database
(不過我沒仔細研究,推測應該是根據相關Entity class 計算出hashcode,新增Db時,將此資料存起來,之後系統使用時,會再將存放的hashcode 取出與系統的Entity class 計算出的hashcode 比對,若是不一樣,就drop database 然後重建)
延續上一篇的範例,首先建立一個 CompanyDbInitializer class,繼承 DropCreateDatabaseAlways<CompanyDbContext>
public class CompanyDbInitializer : DropCreateDatabaseAlways<CompanyDbContext> {
protected override void Seed(CompanyDbContext context) {
//dept
var depts = new Department[]{
new Department {
Name = "步藥勁萊", Description = "來了就不要離開"
},
new Department {
Name = "勁萊玩淡了", Description = "看我怎麼整死你"
}
};
depts.ToList().ForEach(d => context.Departments.Add(d));
//location
var locations = new Location[]{
new Location { LocationName = "地獄"},
new Location {LocationName = "還是地獄"}
};
locations.ToList().ForEach(l => context.Locations.Add(l));
//project
var projects = new Project[]{
new Project{ ProjectName = "大概做不完的專案", CreateDate = new DateTime(2010,1,1)},
new Project{ ProjectName = "還是做不完的專案", CreateDate = new DateTime(2009,1,1)},
new Project{ ProjectName = "永遠做不完的專案", CreateDate = new DateTime(2005,1,1)}
};
var employees = new Employee[]{
new Employee{ Name = "享夏般", Title = "勞工", Department = depts[0], Location = locations[0], Projects = new List<Project>() },
new Employee{ Name = "俏頒終", Title = "勞工", Department = depts[1], Location = locations[1], Projects = new List<Project>() },
};
employees[0].Projects.Add(projects[0]);
employees[0].Projects.Add(projects[1]);
employees[1].Projects.Add(projects[0]);
employees[1].Projects.Add(projects[1]);
employees[1].Projects.Add(projects[2]);
employees.ToList().ForEach(e => context.Employees.Add(e));
base.Seed(context);
}
}
其中 Seed 這個method 是用來設定初始資料
因為我是用ASP.NET MVC 做說明,在global的 Application_Start method 加入
System.Data.Entity.Database.SetInitializer(new CompanyDbInitializer());
如此一來,執行ASP.NET MVC時,會依據Seed method內容,建立一個新的Database,可以用Sql Server Profier 觀察看看
原本計畫說明TPH, TPT, TPC 3種繼承的東西,改在下一篇