天天看點

MVC3教程之實體模型和EF CodeFirst

  在本節中,我們将使用Entity Framework 資料通路技術來定義這些模型類,并對這些類來進行操作。EF支援一個被稱之為“code-first”的開發範例。Code-first允許你通過書寫一些簡單的類來建立模型對象,而不用關心這些類的持久化。你可以通過通路這些類的方式來通路資料庫,這是一種非常友善快捷的開發模式。

  1.添加一個Model

  添加Model和添加普通類的操作是一樣的,預設的約定是将它放在Models檔案夾中。我們在Models檔案夾上面點選右鍵,選擇“添加”>“類”,在打開的對話框中輸入類名“Book”,點選“添加”按鈕。編輯器會為我們打開Book類,我們對這個類進行如下修改:

MVC3教程之實體模型和EF CodeFirst

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; }

}

MVC3教程之實體模型和EF CodeFirst

  我們将使用這個類來表示資料庫中的記錄。每一個Book類的執行個體對應資料庫中的一行,Book類中的每一個屬性被映射到資料庫中的一列。

  2.添加資料庫上下文

  在Models檔案夾下建立一個名為“BookDbContext”的類,編輯這個類,将該類派生自“DbContext”類,編輯後的代碼如下:

MVC3教程之實體模型和EF CodeFirst

using System.Data.Entity;

publicclass BookDbContext : DbContext

public DbSet<Book> Books { get; set; }

MVC3教程之實體模型和EF CodeFirst

  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”,基架選擇中的模闆選擇“空控制器”,如下圖:

MVC3教程之實體模型和EF CodeFirst

  點選“添加”按鈕後,VS會添加一個BookController的檔案,該檔案處于打開狀态。編輯Index方法的代碼,查找作者為Tom的圖書:

MVC3教程之實體模型和EF CodeFirst

public ActionResult Index()

var books = from b in db.Books

where b.Author =="Tom"

select b;

return View(books.ToList());

MVC3教程之實體模型和EF CodeFirst

  在這段代碼中,db是類BookDbContext的一個執行個體,我們在Controller類中定義如下:BookDbContext db = new BookDbContext();

  這是一個簡單的Linq查詢,在對資料庫進行操作時,EF會檢查目前的資料連接配接指定的資料庫是否被建立,如果沒有則有EF負責根據實體模型類建立資料庫、資料表;如果存在,EF會将查詢條件添加到Sql查詢語句,再将Sql語句發送到資料庫進行資料讀取。在完成資料讀取後,将資料轉換為實體對象集合。EF對資料庫的操作大緻如此。

  在Index方法内點選右鍵 > “添加視圖”,在打開的“添加視圖”對話框,勾選“建立強類型視圖”,在模型類清單中選擇“Book(MvcHelloworld.Models)”,在支架模闆清單中選擇“List”,如下圖:

MVC3教程之實體模型和EF CodeFirst

  點選“添加”按鈕,VS為我們在Views檔案夾下建立了“Book”檔案夾,并在Book檔案夾中添加了檔案“Index.cshtml”。

  Index.cshtml是我們的視圖頁面,我們可以把它看做一個模闆,将我們的資料按照模闆的格式進行輸出。在這個模闆中,我們使用了Razor視圖引擎,在Razor中,我們可以使用@model 用來指定傳到視圖的 Model 類型,通路傳入視圖的資料内容。我們簡單的修改代碼,如果你了解HTML,這将是很簡單的事情:

MVC3教程之實體模型和EF CodeFirst

@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>

MVC3教程之實體模型和EF CodeFirst

  編譯并運作程式,在浏覽器中輸入位址:http://localhost:xxx/Book,得到的運作結果如下:

MVC3教程之實體模型和EF CodeFirst

  盡管沒有資料,但EF已經為我們建立了相應的資料庫。

  5.增加Create視圖

  “增加圖書”連接配接需要我們有一個Create控制器和與之對應的視圖。打開BookController檔案,添加一個Create方法,代碼如下:

public ActionResult Create()

return View();

  這個方法傳回一個視圖,該視圖中包含了使用者要輸入的表單。現在我們來實作這個Create視圖,我們将在這個視圖中向使用者顯示追加資料時所需要用到的表單。在Create方法中點選滑鼠右鍵,并點選上下文菜單中的“添加視圖”。在“添加視圖”對話框中勾選“建立強類型視圖”,在模型類清單中選擇“Book(MvcHelloworld.Models)”,在支架模闆清單中選擇“Create”,如下圖:

MVC3教程之實體模型和EF CodeFirst

  點選“添加”按鈕,VS會在Views/Book目錄下添加一個Create.cshtml檔案,由于我們選擇了Create支架模闆,是以在VS為我們生成了一些預設的代碼。在這個視圖模闆中,我們指定了強類型Book作為它的模型類,VS檢查Book類,并根據Book類的屬性,生成了對應的标簽名和編輯框,我們修改标簽名,使它顯示中文,修改後的代碼如下:

MVC3教程之實體模型和EF CodeFirst

@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")

MVC3教程之實體模型和EF CodeFirst

  分析這段代碼:

@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, 檢視新增界面,截圖如下:

MVC3教程之實體模型和EF CodeFirst

  6.添加Create的Postback方法

  在完成了添加Create視圖後,我們僅是可以将添加界面顯示出來,并不能實際的完成資料的添加,因為我們還沒有增加按鈕的處理方法,沒有實際的處理添加事件。為了能夠完成資料的增加,下面我們來添加一個Create的POSTBack方法,代碼如下:

MVC3教程之實體模型和EF CodeFirst

[HttpPost]

public ActionResult Create(Book book)

if (ModelState.IsValid)

db.Books.Add(book);

db.SaveChanges();

return RedirectToAction("Index");

else

return View(book);

MVC3教程之實體模型和EF CodeFirst

  這時,我們在頁面上輸入資料,并點選“增加”按鈕時,EF就會通過這段代碼來添加一行資料庫記錄。打開資料庫,我們可以看到如下記錄:

MVC3教程之實體模型和EF CodeFirst

  7.設定實體模型的資料驗證

  在ASP.NET MVC中,有一條作為核心的原則,就是DRY(“Don’t Repeat Yourself,中文意思為:不要讓開發者重複做同樣的事情,即“一處定義、處處可用”)原則。這樣可以減少開發者的代碼編寫量,同時也更加便于代碼的維護。

  ASP.NET MVC與EF code-first提供的預設驗證規則就是一個實作DRY原則的很好的例子。你也可以在模型類中顯式地追加一個驗證規則,然後在整個應用程式中都使用這個驗證規則。

  打開Book模型檔案,添加 System.ComponentModel.DataAnnotations 的引用,并修改實體類的代碼如下:

MVC3教程之實體模型和EF CodeFirst

[Required(ErrorMessage="必須輸入圖書名稱")]

[StringLength(maximumLength:100, MinimumLength=1, ErrorMessage="最多允許輸入100個字元")]

[Required(ErrorMessage ="必須輸入作者名稱")]

[Required(ErrorMessage ="必須輸入出版社")]

MVC3教程之實體模型和EF CodeFirst

  将資料庫中之前生成的資料庫db_Book删除掉,重新生成解決方案,打開新增頁面,不輸入任何資料的時候點選“增加”按鈕,這個時侯,界面上會出現一些提示資訊,并且阻止了我們進行資料的送出操作。界面如下:

MVC3教程之實體模型和EF CodeFirst

  通過本節的學習,我們可以了解EF CodeFirst功能、MVC實體模型的操作等。對于實體的操作,還有更新、檢視和删除操作,筆者不再一一講解其步驟,隻将控制器代碼貼出,以供朋友們參照。視圖的代碼可以參考自動生成,稍作修改即可。

MVC3教程之實體模型和EF CodeFirst
MVC3教程之實體模型和EF CodeFirst

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,如需轉載請自行聯系原作者