前面我們已經能簡單的建立起MVC4項目了,接下來在項目中添加一個類庫,這個類庫是用來建EF用的,它承擔著MVC中Model層的作用。首先添加"ADO.NET實體資料模型",(我用的是簡體中文版)雖然建立很簡單但是照顧初學者就做了。
這樣就完成了EF的建立
在前一篇已經說過通過一個小小的Demo去開始Code First。通過這個小例子進行簡單的CRUD,首先開始建立實體。
一、建立實體
我很喜歡EF的圖形化設計領域結構,實體設計如:
很容易的看出來學生和成績記錄以下稱成績單和學生是1對多的關係,一個學生可以有多個成績記錄,因為每個課程都會有一個成績記錄,一個課程也可以有多次記錄,所以我們不難發現學生和課程是一個多對多的關係,一個學生有對個課程,當然一個課程也可以同屬於多個學生。
二、寫實體
關係已經理清,我們就要去寫這些實體。也許用過EF的大俠們都知道EF只要你將實體設計好,後台會自動產生類。但是在這裡我不這樣做,我不讓它自動產生,我將EF的屬性,代碼建置原則改成“無”,如所示:
大家注意畫了紅線的部分這樣EF就不會在後台自動給我們產生代碼了。那麼大家會好奇,那我是不是要手動去寫這些類和關係映射。答案是"NO"。這就是微軟的強大了。我們用T4模板產生顯示的實體代碼。首先添加代碼產生項
在這裡選中ADO.NET DbContext Generrator,也就是圖上畫紅線的選項,大家也許記得我在前面說我我們要用到EF4.1的一些新特性。這裡開始體現了。經過以操作實體已經產生。
學生的實體:
namespace MVC4School.Model{ using System; using System.Collections.Generic; public partial class Student { public Student() { this.Performance = new HashSet<Performance>(); } public System.Guid ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string StudentNum { get; set; } public System.DateTime CreateAt { get; set; } public string RecordTime { get; set; } public virtual ICollection<Performance> Performance { get; set; } }}
你很容易看到其中成績記錄屬性被virtual修飾,說明是消極式載入,這提高了效能,在EF中這個virtual不是必須的,不用visual在引用的是後也不會報錯只是為null,也許瞭解nhibernate的同志知道這個在nhibernate中是必須的沒有是會報錯的。
成績記錄的實體代碼如下:
namespace MVC4School.Model{ using System; using System.Collections.Generic; public partial class Performance { public System.Guid ID { get; set; } public string Score { get; set; } public string CreatAt { get; set; } public virtual Student Student { get; set; } public virtual Course Course { get; set; } }}
課程實體代碼如下:
namespace MVC4School.Model{ using System; using System.Collections.Generic; public partial class Course { public Course() { this.Performance = new HashSet<Performance>(); } public System.Guid ID { get; set; } public string Name { get; set; } public string CreatAt { get; set; } public virtual ICollection<Performance> Performance { get; set; } }}
這樣這三個實體的代碼都完整的展現在我們的面前,但事實我們不用寫一行代碼,是不是很方便呢?(不要說我懶,有快捷的方式我為什麼不用呢?)
三、creating the Database Context
這個類主要將上面建立的類包含在其中,住要是指哪些實體包含在資料模型中,同時這個類指定我們建立的實體的映射關係,另一方面指定一些約束。
自動產生的程式碼如下:
View Code
1 namespace MVC4School.Model 2 { 3 using System; 4 using System.Data.Entity; 5 using System.Data.Entity.Infrastructure; 6 7 public partial class SchoolModelContainer : DbContext 8 { 9 public SchoolModelContainer()10 : base("name=SchoolModelContainer")11 {12 }13 14 protected override void OnModelCreating(DbModelBuilder modelBuilder)15 {16 throw new UnintentionalCodeFirstException();17 }18 19 public DbSet<Student> Students { get; set; }20 public DbSet<Course> Courses { get; set; }21 public DbSet<Performance> Performances { get; set; }22 }23 }
這裡我給一些簡單的解說
public SchoolModelContainer() : base("name=SchoolModelContainer") { }
"name=SchoolModelConter"這個指定了連接字串,這個連接字串在App.config設定檔中,你開啟這個檔案會看到這樣一段代碼:
<?xml version="1.0" encoding="utf-8"?><configuration> <connectionStrings> <add name="SchoolModelContainer" connectionString="metadata=res://*/SchoolModel.csdl|res://*/SchoolModel.ssdl|res://*/SchoolModel.msl;provider=System.Data.SqlClient;provider connection string='data source=.\SQLEXPRESS;attachdbfilename="C:\Documents and Settings\Administrator.9682B89E07F644F\My Documents\SchoolModel.mdf";integrated security=True;connect timeout=30;user instance=True;multipleactiveresultsets=True;App=EntityFramework'" providerName="System.Data.EntityClient" /> </connectionStrings></configuration>
這段連接字串指定了資料庫類型和連接字串,忘了和大家說了,EF支援大部分流行資料庫的。
這樣T4模板為我們做了所有的代碼編寫工作。下一節我給大家展示資料初始化和基本的CRUD。
未完待續……