首先我在Models文件夹中定义了三个类。并且在第一个类中引用了后面两个类,相当于外键的关系。然后在控制器中增加一个控制器,引用EF框架,第一次没有给每个类定义一个key(键)的特性结果无法通过,后来加上了特性后没有编译程序结果也创建不了。后来终于创建了一个控制器类,并引用EF框架,引用EF框架必须的有个数据访问上下文对象,这些只要把名字定义好后IDE会自己自动创建,创建好全部后第一次运行会自动的查找连接,并创建一个连接,如果没有数据库则创建数据库,这里的数据源不一定是数据库也可以是TXT文本,可以更改数据库连接字符串,和引用的链接名称、数据库名称等,默认生成数据库名称看起来很不友好。数据上下文类中会自动定义好了模型类中需要的对象,然后会根据这个定义的去创建数据库主外键都会根据类的定义去自动创建。我们可以在应用程序开始的时候定义数据库每次都重新创建,并且还可以给一些表中的默认值。
MusicStoreDB.cs
public class MusicStoreDB : DbContext { // You can add custom code to this file. Changes will not be overwritten. // // If you want Entity Framework to drop and regenerate your database // automatically whenever you change your model schema, please use data migrations. // For more information refer to the documentation: // http://msdn.microsoft.com/en-us/data/jj591621.aspx public MusicStoreDB() : base("name=MusicStoreDB") { } public System.Data.Entity.DbSet<MusicStore.Models.Album> Albums { get; set; } public System.Data.Entity.DbSet<MusicStore.Models.Artist> Artists { get; set; } public System.Data.Entity.DbSet<MusicStore.Models.Genre> Genres { get; set; } }
MusicStoreDbInitializer.cs 自定义的初始化类
/// <summary> /// 播种数据库 /// </summary> public class MusicStoreDbInitializer:DropCreateDatabaseAlways<MusicStoreDB> { protected override void Seed(MusicStoreDB context) { context.Artists.Add(new Artist {Name="Jack" }); context.Genres.Add(new Genre { Name="Tom" }); context.Albums.Add(new Album { Artist = new Artist { Name = "Rush" }, Genre = new Genre { Name = "Rock" }, Title = "Caravan" }); base.Seed(context); } }
Global.asax
protected void Application_Start() { //Database.SetInitializer(new DropCreateDatabaseAlways<MusicStore.Models.MusicStoreDB>());//设置初始化器,每次运行程序都会创建数据库 Database.SetInitializer(new MusicStore.Models.MusicStoreDbInitializer());//每次程序开始后创建数据库,并设置播种(表中的默认数据) AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
StoreManagerController.cs
using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using MusicStore.Models; namespace MusicStore.Controllers { public class StoreManagerController : Controller { private MusicStoreDB db = new MusicStoreDB(); // GET: StoreManager public ActionResult Index() { var albums = db.Albums.Include(a => a.Artist).Include(a => a.Genre); return View(albums.ToList()); } // GET: StoreManager/Details/5 public ActionResult Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Album album = db.Albums.Find(id); if (album == null) { return HttpNotFound(); } return View(album); } // GET: StoreManager/Create public ActionResult Create() { ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name"); ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name"); return View(); } // POST: StoreManager/Create // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关 // 详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=317598。 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "AblumId,GenreId,ArtistId,Title,Price,AlbumArtUrl")] Album album) { if (ModelState.IsValid) { db.Albums.Add(album); db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId); ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId); return View(album); } // GET: StoreManager/Edit/5 public ActionResult Edit(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Album album = db.Albums.Find(id); if (album == null) { return HttpNotFound(); } ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId); ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId); return View(album); } // POST: StoreManager/Edit/5 // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关 // 详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=317598。 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit([Bind(Include = "AblumId,GenreId,ArtistId,Title,Price,AlbumArtUrl")] Album album) { if (ModelState.IsValid) { db.Entry(album).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId); ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId); return View(album); } // GET: StoreManager/Delete/5 public ActionResult Delete(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Album album = db.Albums.Find(id); if (album == null) { return HttpNotFound(); } return View(album); } // POST: StoreManager/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public ActionResult DeleteConfirmed(int id) { Album album = db.Albums.Find(id); db.Albums.Remove(album); db.SaveChanges(); return RedirectToAction("Index"); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } } }
到此一个拥有基本功能的程序就已经完成。
程序提交的时候为了防止重复提交攻击可以用:[Bind(Include = "AblumId,GenreId,ArtistId,Title,Price,AlbumArtUrl")] Album album 限制绑定特性.
当操作器中有参数时。模型绑定会隐士的工作,我们也可以使用控制器中的方法现实的调用模型绑定。
显示模型绑定:
UpdateModel()中填写一个对象,如果绑定过程中出现错误将抛出异常。
TryUpdateModel()也可以调用模型绑定,如果过程出现错误将返回false。
模型绑定后我们可以随时查看模型状态:ModelState.IsValid检查模型绑定是否成功。
以上两个显示模型绑定可以指定想要通过模型绑定的参数。例如:UpdateModel(product,new []{"ID","Title","Price"})
如果模型绑定失败,那么模型状态中包含了一些失败信心,主要是给用户看的,说明为什么失败等信息。