MVC自学系列之四(MVC模型-Models)
ASP.NET MVC 提供了一系列工具和特性去使用仅仅定义的对象模型。你可以坐下来好好思考你将要解决的问题,并且写好C#类,当你准备好时就可以使用MVC提供的工具去为每一个实体构建标准的index、create、edit、delete方法,这个构建的工作就称为“基架”(Scaffloding)。
所谓“基架”就是MVC提供的能够在应用程序中产生你所需要的增删改查(CURD)的基础功能的模板代码。
EF
1、通过EF(EninityFramework),开发人员可以使用model-first、schema-first、code-first几种模式。
2、code-first的约定
①如果你想要在数据库中存储类型为A的实体对象,EF会认为你想要在数据库中创建一个名为A的表。如果你的对象中有一个属性名为ID,那EF会把这个ID属性作为表A的主键并且是自动增长的。EF还有一些外键关系、数据库名等等,这些约定代替了你过去在ORM框架中的映射和配置。如果你需要使用已存在的数据库,那么你可能需要提供映射元数据。
②使用EF的code-first,到达数据库的途径就是让你的类继承自DbContext类,这样继承类就将会有一个或多个DbSet<T>类型的属性,每一T代表着你想要保存的类型。
③加载相关联对象--延迟加载
public ViewResult Index()
{
var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
return View(albums.ToList());
}在Index中的Include方法使用即时加载模式去加载与album对象相关联的atrist和genre信息。即时加载模式试图通过使用单一查询去加载所有的数据。
另一种策略是EF的延时加载模式,EF仅加载LINQ语句中的主要对象(album),而不会加载相关联的属性Genre和Artist,直到需要使用它们的时候才进行加载。但是对于去加载album信息,延时加载会进行多一次的查询,比如有100条album信息,却要进行101次的查询,这就是人们所谓的N+1问题,当使用ORM框架时这是需要面对的问题,延时加载很方便,但是有潜在的额外消耗。
3.用EF生成数据库
①EF的code-first方式尽可能得采用约定大于配置的方针,如果你不去配置从模型到数据库表、列特定的映射,那么EF就用约定去创建数据库表;如果你不想配置特殊的数据库连接,EF会采用约定的配置。
②初始化你的数据库数据
当你调用EF的Database类静态SetInitializer方法时,可以选择以下两个方案中的一种,其一是DropCreateDatabaseAlways,其二是DropCreateDatabaseIfModelChanges。
4.初始化你的数据库数据(Seeding to database)
你可以继承自DropCreateDatabaseAlways类并且重写Seed方法
protected override void Seed(MusicStoreDB context)
{
context.Artists.Add(new Artist { Name = "罗志祥" }); context.Genres.Add(new Genre { Name="摇滚"}); context.Albums.Add(new Album
{
Arist = new Artist { Name = "周杰伦" },
Genre = new Genre { Name="中国风"},
Price = 25.5m,
Title = "依然范特西"
}); base.Seed(context);
}
然后再Global.asax文件中的Application_Start()方法中添加
Database.SetInitializer(new MusicStoreDbInitializer());
5.完成你的应用程序初始化仅需要三步骤
①完成你的模型类
②利于“基架”构建你的控制器(controller)和视图(Views)
③选择你的数据库初始化策略
Edit Action
[HttpPost]
public ActionResult Edit(Album album)
{
if (ModelState.IsValid)
{
db.Entry(album).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.GenreId = new SelectList(db.Genres, "GenreId",
"Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId",
"Name", album.ArtistId);
return View(album);
}
这个方法的职责就是接受用户编辑过后传回来的Album实体;如果实体状态有效,我们把dbContext的状态改为修改模式,最后SaveChanges()就将新的实体对象保存到了数据库中。
模型绑定
1.你知道编辑视图将要发送一些值为服务器,如果你在服务器端想要接受这些值,你可能会从request中直接获得你想要的值,比如
[HttpPost]
public ActionResult Edit()
{
var album = new Album();
album.Title = Request.Form["Title"];
album.Price = Decimal.Parse(Request.Form["Price"]);
}
这样当有一两个接受值还好,假如有四五个或者更多时,这样的操作就有点麻烦了;
2.MVC提供的模型绑定功能,如果你input输入的name名与属性名相匹配时;MVC运行时会为你的带参action方法提供默认模型绑定功能,它能够自动将回传回来的值转化为album正确的属性类型。换句话来说,模型绑定当发现Album有一个Title的属性,它就会在请求值中寻找名为Name为"Title”的值
3.确认你的模型绑定
当你的方法有参数时,模型绑定就能够确认如何工作了;你仍然需要去确认模型绑定时在你的controller中使用的是UpdateModel还是TryUpdateModel模式,它们之间的区别是:当模型绑定出错或是模型无效时,UpdateModel会抛出异常,而TryUateModel;就像intParse和intTryParse类型;
MVC自学系列之四(MVC模型-Models)的更多相关文章
- MVC自学系列之三(MVC视图-Views)
		
View的约定 1.根据约定,Views目录下包含着每一个与Controller同名但是没有像Controller后缀的文件夹:因此对于控制器HomeController就对应在views目录下有个目 ...
 - C# MVC 自学笔记—5 添加模型
		
==============================翻译============================== 在本节中,您将添加一些类来管理数据库中的电影.这些类将 ASP.NET M ...
 - MVC自学系列之二(MVC控制器-Controllers)
		
Controllers的职责 1.MVC模式中的Controllers的职责是对用户的输入做出响应,对用户的输入在实体上做一些变化.它关心的是应用的流动,处理传入的数据,并给相关的View提供数据 ...
 - MVC自学系列之一(MVC入门篇)
		
MVC是如何适用于ASP.NET中的 自从2002年ASP.NET 1.0版本的首次发布,就知道ASP.NET和Web Forms是同样一回事.ASP.NET由抽象两层类所支持: -->Sy ...
 - C# MVC 自学笔记—2 MVC Movie简介
		
MVC Movie是微软官方的一个MVC入门项目,我们可以跟着这个项目来实践入门 这是官方地址 http://www.asp.net/mvc/tutorials/mvc-4/getting-start ...
 - 10、ASP.NET MVC入门到精通——Model(模型)和验证
		
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 模型就是处理业务,想要保存.创建.更新.删除的对象. 注解(通过特性实现) DisplayName Required StringLengt ...
 - 用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署
		
用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署 这是微软官方SignalR 2.0教程Getting Started with En ...
 - AspNetCore - MVC实战系列(一)
		
本章开篇先简单介绍下最近两周自己利用业余时间做的一个图片收集网站,当然这个是靠用户自己上传来收集不是去抓某些个网站的图片,那样没意义,这里我取名为“爱留图”:该网站的简单介绍大家可以参考下上篇的内容爱 ...
 - ASP.NET MVC学习系列(二)-WebAPI请求
		
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
 
随机推荐
- MYSQL学习笔记2--mysql 静态和动态plugin
			
mysql源码编译 .cmke 安装 yum install cmake .依赖的库下载机安装: yum -y install gcc* gcc-c++* autoconf* automake* zl ...
 - iOS 如何做才安全--逆向工程 - Reveal、IDA、Hopper、https抓包 等
			
http://www.cnblogs.com/dahe007/p/5546990.html
 - typename使用在模板中区分static成员和类型
			
16.19 编写函数,接受一个容器的引用,打印容器中的元素,使用容器的size_type和size成员来控制打印元素的循环. 16.20 重写上一题的函数,使用begin和end返回的迭代器来控制循环 ...
 - hadoop错误FATAL org.apache.hadoop.hdfs.server.namenode.NameNode Exception in namenode join java.io.IOException There appears to be a gap in the edit log
			
错误: FATAL org.apache.hadoop.hdfs.server.namenode.NameNode Exception in namenode join java.io.IOExcep ...
 - Spring远端调用的实现-Spring Http调用的实现
			
1:Spring Http设计思想 最近在研究公司自己的一套rpc远程调用框架,看到其内部实现的设计思想依赖于spring的远端调用的思想,所以闲来无事,就想学习下,并记录下. 作为spring远端调 ...
 - ArcGIS 在地图上添加标注
			
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - python learning_curve函数
			
这个函数需要引用sklearn包 import sklearn from sklearn.learning_curve import learning_curve 这个函数的调用格式是: learni ...
 - JSON 学习总结 <一>:什么是JSON
			
JSON的相关资料和博客很多,JSON无处不用,最近项目中一直要用到JSON,今天没有加班,就写下,算是对自己的总结,对JSON又一次深入的认识. 废话不多了,直接进入今天的主题: 如题:今天就介绍下 ...
 - file的name值
			
在picturelibrary中取一张jpg文件, 其Name值为 "NoThumbnail.jpg",注意后面的.jpg foreach (SPFile ...
 - 解决 TortoiseGit 诡异的 Bad file number 问题
			
http://blog.csdn.net/renfufei/article/details/41648061 问题描述 昨天,以及今天(2014-11-29),使用 TortoiseGit 时碰到了一 ...