《Entity Framework 6 Recipes》中文翻譯系列 (20) -----第四章 ASP.NET MVC中使用實體框架之在MVC中構建一個CRUD示例

翻譯的初衷以及爲何選擇《Entity Framework 6 Recipes》來學習,請看本系列開篇html

 第四章  ASP.NET MVC中使用實體框架

   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應用來展現,咱們儘量地保持示例的簡單,所以不打算包含默認模板中的全部功能。數據庫

 

4.1. 構建一個包含CRUD操做的ASP.NET MVC頁

  建立、讀取、更新、刪除(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/

相關文章
相關標籤/搜索