Entity Framework 4.1 Code First (3)

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種繼承的東西,改在下一篇

下載範例 MyCodeFirstMvcWeb.rar