本章導航
2、MVC4中的一些變化
3、T4模板
4、使用EF CODE FIRST修改應用程序
一、創建一個MVC4應用程序
首先打開VS2012,選擇【新建項目】彈出新建項目對話框,選擇【ASP.NET MVC4 WEB 應用程序】。如圖:

修改名稱為我們想要的名稱,在這里我命名為“MyMVC4Web”,目錄設置在了我的E盤exercise文件夾下。隨后會出現模板選擇框,我們選擇Internet應用程序,視圖引擎使用Razor,如果有需要可以創建單元測試。

【確定】之后就等待VS自動加載需要的東西。加載完成之后,【解決方案資源管理器】如下圖所示。

這樣,MVC4應用程序的“Hello World”程序就創建完成了。運行看一下效果。

二、MVC4中的一些變化
首先在項目中對Global.asax進行了優化,將原來在MVC3中使用的代碼移到了【App_Start】文件夾下,而Global.asax只負責初始化。


三、T4模板
對於T4模板,使用MVC的開發程序員們應該都有一定的了解,而且在很早之前就有人介紹過T4模板的使用。這里不再過多介紹。給出原文地址,大家感興趣可以看一下。另外要說一下的是,T4模板編輯器(T4 Editor)現在只支持到2010,對於2012還不能安裝,這個很叫我郁悶。
四、使用EF CODE FIRST修改應用程序
本部分借鑒了asp.net 網站的教程內容,並使用了其中的Model、設計概念和部分代碼。
首先我們在【Models】文件夾上右擊選擇新建類,並取名為Movie。類內容如下:
1 public class Movie 2 { 3 public int ID { get; set; } 4 public string Title { get; set; } 5 public DateTime ReleaseDate { get; set; } 6 public string Genre { get; set; } 7 public decimal Price { get; set; } 8 }
然后在項目名稱上右擊,新建文件夾,取名為DAL,並在DAL中創建一個用於數據庫上下文的類:MovieContext。類內容如下:
1 public class MovieContext:DbContext 2 { 3 public DbSet<Movie> Movie { get; set; } 4 protected override void OnModelCreating(DbModelBuilder modelBuilder) 5 { 6 //base.OnModelCreating(modelBuilder); 7 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 8 } 9 }
這里繼承了DbContext,這個基類和下面的DbSet<>都是用於Code First模式的,當然DataBase First也可以用。同時我們要重寫OnModelCreating()方法,在這個方法里移除表名復數的契約。比如我們在這里Model叫Movie,如果不加modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();這句話,在數據庫表中表名會被設置為Movies。這種情況下,就需要移除這個契約。
接下來我們要設置連接串,如下圖:

到這里,我們要生成以下解決方案,以避免在下面的操作中找不到必要的類。
接下來右擊【Controller】文件,新建控制器。在新建控制器選框中,我們這樣設置:

然后點擊添加。添加過程可能有點緩慢,原因是由於VS通過我們選擇好的選項根據T4模板去生成我們需要的Controller和View。待一切都結束之后,VS會自動打開剛剛創建好的文件,一共有5個,分別是MoviController.cs,Index.cshtml,Create.cshtml,Detail.cshtml,Edit.cshtml和Delete.cshtml。
隨后,我們打開【Views】-【Shared】文件夾下的_Layout.cshtml,這個是網站的母版頁,在其中加上這樣一句話:

說白了就是給加上一個鏈接,可以鏈接到我們剛剛創建好的頁面上。接下來我們就可以F5預覽效果了。
到這里,還有一個關鍵沒有講,那就是我們並沒有告知系統我們使用哪個數據庫連接串,它是怎么做到的呢?

原因很簡單,就是因為我們的MovieContext繼承了DbContext,F12導航到它的定義,你就知道是怎么一回事了。

同樣我們也知道了如何使用自定義的連接串了!
2013/2/23更
只要我們使用DbContext帶參構造函數就可以了,代碼如下
1 private static const string Connection_str = "name=******"; 2 public MovieContext() : base(Connection_str) { }*******處指的是連接串的名稱。
-------------------------------------------------------------------------------------------------
2013/2/22更新
在Movie.cs實體類中,並沒有設置主鍵,但是在數據庫中我們看到ID還是被設置成了主鍵。
這是因為在EF當中,以ID或者實體類名+ID(如MovieID)都會在創建時自動設置成主鍵,並且以int類型標記的主鍵會被設置成自動增長列,如果是GUID類型,則需要標記屬性為[GUID]。
-------------------------------------------------------------------------------------------------
2013/2/25更


