前面我們已經能簡單的建立起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
這個類主要將上面創建的類包含在其中,住要是指哪些實體包含在數據模型中,同時這個類指定我們創建的實體的映射關系,另一方面指定一些約束。
自動生成的代碼如下:

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。
未完待續……