MVC中的基架能夠爲應用程序提供CURD各類功能生成所須要的樣板代碼。在添加控制器的時候能夠選擇相應的模板以及實體對象來生成相應的模板代碼。web
首先定義一個模型類以下所示:數據庫
namespace LYG.HelloWorld.Models { public class Album { public virtual int AlbumId { get; set; } public virtual string Title { get; set; } public virtual decimal Price { get; set; } public virtual Artist Artist { get; set; } } public class Artist { public virtual int ArtistId { get; set; } public virtual string Name { get; set; } } }
而後選擇添加控制器,選擇相應的基架,這裏列出來的有好多種不一樣的基架。數據結構
再點下一步選擇相應的模型和數據上下文,以下圖所示,而後點添加按鈕。框架
這樣在生成的控制器中會生成CURD的各類操做代碼以及視圖文件也會同時生成,大大簡化了工做量,提升了工做效率。這裏由於剛接觸基架還不明白各類基架的優缺點,後續將單獨進行學習比較,選擇適合本身項目的基架。asp.net
一、代碼優先約定;ide
開發變得更輕鬆,經過代碼的方式來產生須要存儲的數據結構。學習
二、DbContext類;測試
當使用代碼優先開發方式時,須要使用EF的DbContext類派生出一個類來訪問數據庫。這個類有一個或多個DbSet<T>的屬性。每個T表示要持久的對象。如:spa
public class MusicStoreDB:DbContext { public MusicStoreDB():base("DefaultConnection") { } public DbSet<Album> albums { get; set; } public DbSet<Artist> artists { get; set; } 而後控制器以下所示訪問數據庫: var db = new MusicStoreDB(); var allAlbums = from album in db.albums orderby album.Title ascending select album; return View(allAlbums.ToList()); }
最後視圖讀取數據:.net
@model IEnumerable<LYG.HelloWorld.Models.Album> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <p> @Html.ActionLink("Create New", "Create") </p> <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.Title) </th> <th> @Html.DisplayNameFor(model => model.Price) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) | @Html.ActionLink("Details", "Details", new { id=item.AlbumId }) | @Html.ActionLink("Delete", "Delete", new { id=item.AlbumId }) </td> </tr> } </table>
在開發過程當中常常變動數據結構,若是想要從新生成新的數據結構字段,須要初始化數據庫,能夠在Global.asax.cs文件中增長以下代碼:
Database.SetInitializer(new DropCreateDatabaseAlways<MusicStoreDB>());
這樣每次啓動應用程序時都會從新構建數據,但這樣會存在一個問題,有部分初始化的基礎數據都會清空,所以便於測試,須要進行數據庫播種。以下代碼所示:
public class MusicStoreDBInitializer: DropCreateDatabaseAlways<MusicStoreDB> { protected override void Seed(MusicStoreDB context) { context.artists.Add(new Artist { Name="李小衛"}); context.albums.Add(new Album { Title="汪峯2018演唱會", Price=580, Artist= new Artist { Name = "李小衛" } }); base.Seed(context); } }
Global.asax.cs中增長以下代碼:
Database.SetInitializer(new MusicStoreDBInitializer());
注意這裏本人測試結果是執行到刪除數據庫的時候提示數據庫正在使用,而後刪除異常,還未找到緣由。這是程序拋出的異常:Cannot drop database "MusicStoreDB" because it is currently in use.
之前asp.net webform的通用寫法是經過Request.Form[「Title」]相似這樣獲取傳輸過來的參數值。若是表單字段類型過多,感受就會變得冗長泛味。Asp.net MVC能夠經過表單元素的命名與模型實體的名稱相同,這樣就能夠經過一個實體參數來獲取所傳輸過來的全部字段類型。
一、默認模型綁定DefaultModelBinder,代碼以下:
[HttpPost] //注意這裏的參數是經過album中的屬性與視圖表單中的元素命名一致的控件傳輸過來的參數值。 public ActionResult Edit(Album album) { if (ModelState.IsValid) { musicDB.Entry(album).State = EntityState.Modified; musicDB.SaveChanges(); return RedirectToAction("Index"); } return View(album); }
注意經過這種模型綁定器會綁定全部album中的參數,這樣會增長「重複提交」攻擊的風險,能夠設置一兩個屬性不使用模型綁定器來設置,將在後面的學習中學習到,須要牢記這個威脅。
二、顯示模型綁定UpdateModel,若是模型無效UpdateModel會拋出一個異常來,代碼以下:
[HttpPost] public ActionResult Edit() { var album = new Album(); //注意聲明一個實例 try { UpdateModel(album); //顯示模型綁定 musicDB.Entry(album).State = EntityState.Modified; musicDB.SaveChanges(); return RedirectToAction("Index"); } catch { return View(album); } }
三、顯示模型綁定TryUpdateModel,若是模型無效UpdateModel不會拋出一個異常來,但會返回true或false來表示模型是否有效,代碼以下:
[HttpPost] public ActionResult Edit() { var album = new Album();//注意聲明一個實例 If(TryUpdateModel(album)) //顯示模型綁定 { musicDB.Entry(album).State = EntityState.Modified; musicDB.SaveChanges(); return RedirectToAction("Index"); } else { return View(album); } }
模型綁定的副產品就是模型狀態,所以也能夠這樣寫:
[HttpPost] public ActionResult Edit() { var album = new Album();//注意聲明一個實例 TryUpdateModel(album) If(ModelState.IsValid) //顯示模型綁定 { musicDB.Entry(album).State = EntityState.Modified; musicDB.SaveChanges(); return RedirectToAction("Index"); } else { return View(album); } }
模型知識到此就學習完了,接下來學習模型狀態如何使用HTML輔助方法、MVC驗證特性和模型綁定一塊兒工做。