翻譯的初衷以及爲何選擇《Entity Framework 6 Recipes》來學習,請看本系列開篇html
ASP.NET是一個免費的Web框架,它支持3種不一樣的技術來建立websites(網站)和Web應用;他們分別是,Web Pages,Web Forms,和MVC。雖然MVC是一種很是流行的,有完整的用於軟件開發模式理論的技術,但它在ASP.NET中倒是一種新的技術。 目前最新的版本是2012年發佈的ASP.NET MVC4。自從2008年發佈最初的版本後,它已經變成繼ASP.NET Web-Forms後的一種流行的開發方式。所以,本章將展現ASP.NET MVC4和實體框架的開發技巧,不覆蓋ASP.NET中另外兩種技術---ASP.NET Web Forms和ASP.NET Web Pages。jquery
本章將全面地介紹構建一個包含插入、更新、刪除和實現列表頁搜索的應用。web
本章的每一技巧都是使用Visual Studio2012中的ASP.NET MVC4 Web應用來展現,咱們儘量地保持示例的簡單,所以不打算包含默認模板中的全部功能。數據庫
建立、讀取、更新、刪除(CRUD)操做,幾乎是全部軟件應用最基本的功能。咱們打算在本節使用ASP.NET MVC來實現這些操做。app
問題框架
你想一個ASP.NET MVC頁,它能從模型中插入、更新、刪除和讀取數據。ide
解決方案學習
假設你有一個Web 應用 ,它管理着一個移動應用的app列表。你有如圖4-1所示的模型。網站
圖4-1 一個包含Category實體類型的模型,該實體類型包含一個應用目錄名(Name)和描述(Description)屬性ui
這個模型包含一個category實體類型,你想建立一個簡單的ASP.NET MVC 頁面來展現app的目錄列表。同時,你容許用戶建立一個新的app目錄,更新和刪除一個存在的目錄。雖然有不少方式能夠實現這個需求,但咱們將採用一種很是簡單的方式,讓你理解在ASP.NET MVC中集成實體框架。爲了建立一個MVC應用,你須要三個部分,一個model,一個controller和一個view. 咱們將使用文件MyStore.mdf做爲咱們數據庫。咱們將在視圖中使用Razor視圖引擎。依據動做或操做的須要,雖然只須要一個model,但會有多個views。在咱們的示例中,咱們將使用4個視圖,一個用於建立,一個用於更新,一個用於刪除,一個用於列表顯示。
首先,咱們要建立一個ASP.NET MVC4 的Web應用,如圖4-2和4-3所演示的,我將使用項目模板Internet Application。
圖4-2 在Visua Studio2012中選擇ASP.NET MVC Web Application 項目
圖4-3 選擇項目模型 ASP.NET MVC application
一個新的帶了一些默認文件和文件夾的項目被建立了。
如今能夠爲應用準備數據庫了,爲了使示例簡單清晰,咱們在項目中使用數據庫文件MyStore.mdf。
在Visual Studio開發環境中,很容易建立MDF格式的數據庫文件,這個文件能被附加到SQL Server Experess實例中,並像正常的,完整的數據同樣使用。不一樣之處在於,這只是經過數據庫鏈接字符串附加,並非永久地將其附加到SQL Server的實例中。
右鍵文件夾App_Data並添加一個新的.mdf文件,這個文件能夠用兩種方式添加 ,在Add上下文添加中選擇New Item(新建項),如圖4-4所示,或者選擇 SQL Server Database,如圖4-5所示。
圖4-5 在app_data文件夾中添加新項
圖4-5 選擇一個SQL Server Database文件做爲新建項添加
在.mdf文件中建立三張表後,咱們使用實體框架生成一個新的模型,如圖4-6所示
圖4-6 三張表及其餘們以前的關聯
這個模型是能過添加ADO.NET Entity Data Model到你的項目的Models文件夾中生成的,如圖4-7所示:
圖4-7 添加一個實體數據模型
正如咱們在前面討論的那樣,ASP.NET MVC應用須要三個部分,model,view 和controller。我已經完成對model部分的建立。接下來,咱們須要建立一個controller,最後建立 views。views的數量,由controller中執行的動做來決定。
如圖4-8所示,添加一個controller,右鍵Controllers文件夾,而後選擇添加一個Controller,並命名爲CategoryController.
圖4-8 添加一個controller
正如你看到的那樣,咱們在添加CategoryCntroller的窗口中選擇了模板 empty read/write actions。它會在controller中建立一些動做方法。須要使用的數據庫上下文如代碼清單4-1所示。
代碼清單4-1. 繼承自DbContext類的上下文對象,它將使用實體框架在數據庫執行操做
1 public partial class MyStoreEntities : DbContext 2 { 3 public MyStoreEntities() 4 : base("name=MyStoreEntities") 5 { 6 } 7 8 protected override void OnModelCreating(DbModelBuilder modelBuilder) 9 { 10 throw new UnintentionalCodeFirstException(); 11 } 12 13 public DbSet<App> Apps { get; set; } 14 public DbSet<Category> Categories { get; set; } 15 public DbSet<Developer> Developers { get; set; } 16 }
如代碼清單4-2所示,咱們修改了控制器中的代碼,使它能經過DbContext類執行插入、刪除 、編輯和顯示。
1 // 2 // GET: /Category/ 3 4 public ActionResult Index() 5 { 6 using (var db = new MyStoreEntities()) 7 { 8 return View(db.Categories.ToList()); 9 } 10 } 11 12 // 13 // GET: /Category/Details/5 14 15 public ActionResult Details(int id) 16 { 17 using (var db = new MyStoreEntities()) 18 { 19 return View(db.Categories.Find(id)); 20 } 21 } 22 23 // 24 // GET: /Category/Create 25 26 public ActionResult Create() 27 { 28 return View(); 29 } 30 31 // 32 // POST: /Category/Create 33 34 [HttpPost] 35 public ActionResult Create(Category categoryValue) 36 { 37 try 38 { 39 using (var db = new MyStoreEntities()) 40 { 41 db.Categories.Add(categoryValue); 42 db.SaveChanges(); 43 } 44 return RedirectToAction("Index"); 45 } 46 catch 47 { 48 return View(); 49 } 50 } 51 52 // 53 // GET: /Category/Edit/5 54 55 public ActionResult Edit(int id) 56 { 57 using (var db = new MyStoreEntities()) 58 { 59 return View(db.Categories.Find(id)); 60 } 61 } 62 63 // 64 // POST: /Category/Edit/5 65 66 [HttpPost] 67 public ActionResult Edit(int id, Category categoryValue) 68 { 69 try 70 { 71 using (var db = new MyStoreEntities()) 72 { 73 db.Entry(categoryValue).State = System.Data.Entity.EntityState.Modified; 74 db.SaveChanges(); 75 return RedirectToAction("Index"); 76 } 77 } 78 catch 79 { 80 return View(); 81 } 82 } 83 84 // 85 // GET: /Category/Delete/5 86 87 public ActionResult Delete(int id) 88 { 89 using (var db = new MyStoreEntities()) 90 { 91 return View(db.Categories.Find(id)); 92 } 93 } 94 95 // 96 // POST: /Category/Delete/5 97 98 [HttpPost] 99 public ActionResult Delete(int id, Category categoryValue) 100 { 101 try 102 { 103 using (var db = new MyStoreEntities()) 104 { 105 db.Entry(categoryValue).State = System.Data.Entity.EntityState.Deleted; 106 db.SaveChanges(); 107 return RedirectToAction("Index"); 108 } 109 } 110 catch 111 { 112 return View(); 113 } 114 }
爲CategoryController中的動做,新建、刪除、明細、編輯和Index添加五個視圖。你能夠按圖4-9所示添加視圖,在controller裏的動做方法上右鍵並選擇AddView。這樣一個新的視圖將被添加到Views ➤Category文件夾。
圖4-9 經過在controller中的動做方法添加視圖
在添加視圖的對話框,如圖4-10所示,選擇Razor視圖引擎(CSHTML),而後勾選上建立一個強類型的視圖,最後選擇Category(MyStore.Models)類做爲Model.
圖4-10 添加一個視圖
代碼清單4-3中的Index視圖,是一個顯示app目錄的視圖頁,它上面有New(新建)按鈕,editing(編輯)按鈕、deleting(刪除)按鈕。代碼清單4-4建立的視圖頁用來插入一個應用目錄。
代碼清單4-3. Index視圖代碼
1 @model IEnumerable<MyStore.Models.Category> 2 3 @{ 4 Layout = null; 5 } 6 7 <!DOCTYPE html> 8 9 <html> 10 <head> 11 <meta name="viewport" content="width=device-width" /> 12 <title>Index</title> 13 </head> 14 <body> 15 <p> 16 @Html.ActionLink("Create New", "Create") 17 </p> 18 <table> 19 <tr> 20 <th> 21 @Html.DisplayNameFor(model => model.Name) 22 </th> 23 <th> 24 @Html.DisplayNameFor(model => model.Description) 25 </th> 26 <th></th> 27 </tr> 28 29 @foreach (var item in Model) { 30 <tr> 31 <td> 32 @Html.DisplayFor(modelItem => item.Name) 33 </td> 34 <td> 35 @Html.DisplayFor(modelItem => item.Description) 36 </td> 37 <td> 38 @Html.ActionLink("Edit", "Edit", new { id=item.CategoryId }) | 39 @Html.ActionLink("Details", "Details", new { id=item.CategoryId }) | 40 @Html.ActionLink("Delete", "Delete", new { id=item.CategoryId }) 41 </td> 42 </tr> 43 } 44 45 </table> 46 </body> 47 </html>
代碼清單4-4. Create視圖代碼
1 @model MyStore.Models.Category 2 3 @{ 4 Layout = null; 5 } 6 7 <!DOCTYPE html> 8 9 <html> 10 <head> 11 <meta name="viewport" content="width=device-width" /> 12 <title>Create</title> 13 </head> 14 <body> 15 <script src="~/Scripts/jquery-1.8.2.min.js"></script> 16 <script src="~/Scripts/jquery.validate.min.js"></script> 17 <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> 18 19 @using (Html.BeginForm()) { 20 @Html.AntiForgeryToken() 21 @Html.ValidationSummary(true) 22 23 <fieldset> 24 <legend>Category</legend> 25 26 <div class="editor-label"> 27 @Html.LabelFor(model => model.Name) 28 </div> 29 <div class="editor-field"> 30 @Html.EditorFor(model => model.Name) 31 @Html.ValidationMessageFor(model => model.Name) 32 </div> 33 34 <div class="editor-label"> 35 @Html.LabelFor(model => model.Description) 36 </div> 37 <div class="editor-field"> 38 @Html.EditorFor(model => model.Description) 39 @Html.ValidationMessageFor(model => model.Description) 40 </div> 41 42 <p> 43 <input type="submit" value="Create" /> 44 </p> 45 </fieldset> 46 } 47 48 <div> 49 @Html.ActionLink("Back to List", "Index") 50 </div> 51 </body> 52 </html>
代碼清單4-3中的代碼顯示了一個app目錄列表視圖頁,以及插入目錄,編輯、刪除當前目錄的按鈕。該頁的效果如圖4-11所示。
圖4-11 app目錄列表
圖4-12所示的,文本框容許用戶輸入目錄信息,點擊Create按鈕,將會在數據庫中添加一條新的記錄。
圖4-12 插入一個新的app目錄
如圖4-13所示,在Index視圖上單擊Edit按鈕,將會顯示容許你編輯一個存在的app目錄的視圖頁。
圖4-13 編輯一個app目錄
原理
整個代碼分爲三個部分:
一、上下文對象類(代碼清單4-1);
二、Controller代碼(代碼清單4-2);
三、視圖代碼(代碼清單4-3,4-4);
controller代碼是最大的一部分,它提供了整個操做的核心功能。視圖是基於Controller中的動做方法建立的。全部的獲取,建立,更新,刪除都是在動做方法中處理。視圖不管是經過URL或是另外一個視圖訪問,相應的controller中的動做方法都會被調用。咱們在建立視圖時選擇了scaffoleding 選項。經過選擇這個選項,它會使用razor視圖引擎自動生成編輯、建立 、和顯示列表的HTML代碼。
本篇有點長,主要是圖有點多,辛苦你們了,感謝大家的閱讀!
實體框架交流QQ羣: 458326058,歡迎有興趣的朋友加入一塊兒交流
謝謝你們的持續關注,個人博客地址:http://www.cnblogs.com/VolcanoCloud/