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验证特性和模型绑定一块儿工做。