在本節中,我們将使用Entity Framework 資料通路技術來定義這些模型類,并對這些類來進行操作。EF支援一個被稱之為“code-first”的開發範例。Code-first允許你通過書寫一些簡單的類來建立模型對象,而不用關心這些類的持久化。你可以通過通路這些類的方式來通路資料庫,這是一種非常友善快捷的開發模式。
1.添加一個Model
添加Model和添加普通類的操作是一樣的,預設的約定是将它放在Models檔案夾中。我們在Models檔案夾上面點選右鍵,選擇“添加”>“類”,在打開的對話框中輸入類名“Book”,點選“添加”按鈕。編輯器會為我們打開Book類,我們對這個類進行如下修改:
using System;
namespace MvcHelloworld.Models
{
publicclass Book
publicint BookID { get; set; }
publicstring BookName { get; set; }
publicstring Author { get; set; }
publicstring Publisher { get; set; }
publicdecimal Price { get; set; }
publicstring Remark { get; set; }
}
我們将使用這個類來表示資料庫中的記錄。每一個Book類的執行個體對應資料庫中的一行,Book類中的每一個屬性被映射到資料庫中的一列。
2.添加資料庫上下文
在Models檔案夾下建立一個名為“BookDbContext”的類,編輯這個類,将該類派生自“DbContext”類,編輯後的代碼如下:
using System.Data.Entity;
publicclass BookDbContext : DbContext
public DbSet<Book> Books { get; set; }
BookDbContext代表EF中Book在資料庫中的上下文對象,通過DbSet<Book>使實體類與資料庫關聯起來。Books屬性表示資料庫中的資料集實體,用來處理資料的存取與更新。BookDbContext派生自DbContext,需要添加System.Data.Entity的引用。
3.添加資料庫連接配接
由于我們建立的是空的Mvc項目,是以在Web.config檔案中,不包含任何的資料庫連接配接字元串,我們打開Web.config檔案,為它添加一個資料庫連接配接字元串的配置:
<connectionStrings>
<add name="BookDbContext" connectionString=" Data Source=.\SQLEXPRESS;Initial Catalog=db_book;Persist Security Info=True;Integrated Security=SSPI;"
providerName="System.Data.SqlClient"/>
</connectionStrings>
我們将資料庫連接配接的name屬性設定為“BookDbContext”,這個連接配接會被BookDbContext類使用,并根據連接配接建立相應的資料庫。
4.為Book建立控制器和Index視圖
按照第一節中的步驟,我們為Book模型建立一個控制器:在檔案夾“Controllers”上面點選右鍵 > “添加” > “控制器”,在打開的添加控制器對話框中,将控制器的名稱修改為“BookController”,基架選擇中的模闆選擇“空控制器”,如下圖:
點選“添加”按鈕後,VS會添加一個BookController的檔案,該檔案處于打開狀态。編輯Index方法的代碼,查找作者為Tom的圖書:
public ActionResult Index()
var books = from b in db.Books
where b.Author =="Tom"
select b;
return View(books.ToList());
在這段代碼中,db是類BookDbContext的一個執行個體,我們在Controller類中定義如下:BookDbContext db = new BookDbContext();
這是一個簡單的Linq查詢,在對資料庫進行操作時,EF會檢查目前的資料連接配接指定的資料庫是否被建立,如果沒有則有EF負責根據實體模型類建立資料庫、資料表;如果存在,EF會将查詢條件添加到Sql查詢語句,再将Sql語句發送到資料庫進行資料讀取。在完成資料讀取後,将資料轉換為實體對象集合。EF對資料庫的操作大緻如此。
在Index方法内點選右鍵 > “添加視圖”,在打開的“添加視圖”對話框,勾選“建立強類型視圖”,在模型類清單中選擇“Book(MvcHelloworld.Models)”,在支架模闆清單中選擇“List”,如下圖:
點選“添加”按鈕,VS為我們在Views檔案夾下建立了“Book”檔案夾,并在Book檔案夾中添加了檔案“Index.cshtml”。
Index.cshtml是我們的視圖頁面,我們可以把它看做一個模闆,将我們的資料按照模闆的格式進行輸出。在這個模闆中,我們使用了Razor視圖引擎,在Razor中,我們可以使用@model 用來指定傳到視圖的 Model 類型,通路傳入視圖的資料内容。我們簡單的修改代碼,如果你了解HTML,這将是很簡單的事情:
@model IEnumerable<MvcHelloworld.Models.Book>
@{
ViewBag.Title = "圖書清單 - MvcBook";
<h2>圖書清單</h2>
<p>
@Html.ActionLink("增加圖書", "Create")
</p>
<table>
<tr>
<th>
圖書名稱
</th>
作者
出版社
價格
備注
<th></th>
</tr>
@foreach (var item in Model) {
<td>
@Html.DisplayFor(modelItem => item.BookName)
</td>
@Html.DisplayFor(modelItem => item.Author)
@Html.DisplayFor(modelItem => item.Publisher)
@Html.DisplayFor(modelItem => item.Price)
@Html.DisplayFor(modelItem => item.Remark)
@Html.ActionLink("編輯", "Edit", new { id=item.BookID }) |
@Html.ActionLink("檢視", "Details", new { id=item.BookID }) |
@Html.ActionLink("删除", "Delete", new { id=item.BookID })
</table>
編譯并運作程式,在浏覽器中輸入位址:http://localhost:xxx/Book,得到的運作結果如下:
盡管沒有資料,但EF已經為我們建立了相應的資料庫。
5.增加Create視圖
“增加圖書”連接配接需要我們有一個Create控制器和與之對應的視圖。打開BookController檔案,添加一個Create方法,代碼如下:
public ActionResult Create()
return View();
這個方法傳回一個視圖,該視圖中包含了使用者要輸入的表單。現在我們來實作這個Create視圖,我們将在這個視圖中向使用者顯示追加資料時所需要用到的表單。在Create方法中點選滑鼠右鍵,并點選上下文菜單中的“添加視圖”。在“添加視圖”對話框中勾選“建立強類型視圖”,在模型類清單中選擇“Book(MvcHelloworld.Models)”,在支架模闆清單中選擇“Create”,如下圖:
點選“添加”按鈕,VS會在Views/Book目錄下添加一個Create.cshtml檔案,由于我們選擇了Create支架模闆,是以在VS為我們生成了一些預設的代碼。在這個視圖模闆中,我們指定了強類型Book作為它的模型類,VS檢查Book類,并根據Book類的屬性,生成了對應的标簽名和編輯框,我們修改标簽名,使它顯示中文,修改後的代碼如下:
@model MvcHelloworld.Models.Book
ViewBag.Title = "新增圖書 - MvcBook";
<h2>新增圖書</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>圖書</legend>
<div class="editor-label">
</div>
<div class="editor-field">
@Html.EditorFor(model => model.BookName)
@Html.ValidationMessageFor(model => model.BookName)
@Html.EditorFor(model => model.Author)
@Html.ValidationMessageFor(model => model.Author)
@Html.EditorFor(model => model.Publisher)
@Html.ValidationMessageFor(model => model.Publisher)
@Html.EditorFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
@Html.EditorFor(model => model.Remark)
@Html.ValidationMessageFor(model => model.Remark)
<input type="submit" value="增加"/>
</fieldset>
<div>
@Html.ActionLink("Back to List", "Index")
分析這段代碼:
@model MvcHelloworld.Models.Book:指定了該視圖模闆中的“模型”強類型化成一個Book類。
@using (Html.BeginForm()){ }:建立一個Form表單,在表單中包含了對于Book類所生成的對應字段。
@Html.EditorFor(model => model.BookName):根據模型生成模型中BookName的編輯控件(生成一個Input元素)
@Html.ValidationMessageFor(model => model.BookName):根據模型生成模型中BookName的驗證資訊。
編譯項目,在浏覽器中輸入http://localhost:xxx/Book/Create, 檢視新增界面,截圖如下:
6.添加Create的Postback方法
在完成了添加Create視圖後,我們僅是可以将添加界面顯示出來,并不能實際的完成資料的添加,因為我們還沒有增加按鈕的處理方法,沒有實際的處理添加事件。為了能夠完成資料的增加,下面我們來添加一個Create的POSTBack方法,代碼如下:
[HttpPost]
public ActionResult Create(Book book)
if (ModelState.IsValid)
db.Books.Add(book);
db.SaveChanges();
return RedirectToAction("Index");
else
return View(book);
這時,我們在頁面上輸入資料,并點選“增加”按鈕時,EF就會通過這段代碼來添加一行資料庫記錄。打開資料庫,我們可以看到如下記錄:
7.設定實體模型的資料驗證
在ASP.NET MVC中,有一條作為核心的原則,就是DRY(“Don’t Repeat Yourself,中文意思為:不要讓開發者重複做同樣的事情,即“一處定義、處處可用”)原則。這樣可以減少開發者的代碼編寫量,同時也更加便于代碼的維護。
ASP.NET MVC與EF code-first提供的預設驗證規則就是一個實作DRY原則的很好的例子。你也可以在模型類中顯式地追加一個驗證規則,然後在整個應用程式中都使用這個驗證規則。
打開Book模型檔案,添加 System.ComponentModel.DataAnnotations 的引用,并修改實體類的代碼如下:
[Required(ErrorMessage="必須輸入圖書名稱")]
[StringLength(maximumLength:100, MinimumLength=1, ErrorMessage="最多允許輸入100個字元")]
[Required(ErrorMessage ="必須輸入作者名稱")]
[Required(ErrorMessage ="必須輸入出版社")]
将資料庫中之前生成的資料庫db_Book删除掉,重新生成解決方案,打開新增頁面,不輸入任何資料的時候點選“增加”按鈕,這個時侯,界面上會出現一些提示資訊,并且阻止了我們進行資料的送出操作。界面如下:
通過本節的學習,我們可以了解EF CodeFirst功能、MVC實體模型的操作等。對于實體的操作,還有更新、檢視和删除操作,筆者不再一一講解其步驟,隻将控制器代碼貼出,以供朋友們參照。視圖的代碼可以參考自動生成,稍作修改即可。
BookController代碼
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcHelloworld.Models;
namespace MvcHelloworld.Controllers
publicclass BookController : Controller
BookDbContext db =new BookDbContext();
public ActionResult Edit(int id)
Book book = db.Books.Find(id);
if (book ==null)
public ActionResult Edit(Book newBook)
try
Book oldBook = db.Books.Find(newBook.BookID);
UpdateModel(oldBook);
return RedirectToAction("Details", new { id = newBook.BookID });
catch (Exception ex)
ModelState.AddModelError("", "修改失敗,請檢視詳細錯誤資訊:"+ ex.Message);
return View(newBook);
public ActionResult Details(int id)
public ActionResult Delete(int id)
public ActionResult Delete(int id, FormCollection collection)
db.Books.Remove(book);
本文轉自齊師傅部落格園部落格,原文連結:http://www.cnblogs.com/youring2/archive/2011/07/08/2092486.html,如需轉載請自行聯系原作者