我的目标是月底前看完。今天偷懒了,只看了一点。

第4章:模型

Asp.Net MVC中的模型指是那些发送信息到数据库,执行业务计算并在视图中渲染的模型对象。
这些对象代表应用程序关注的领域,模型就是程序里想要保持、创建、更新和删除的对象。
基架:
使用工具为每个模型对象的索引、创建、编辑和删除等功能构建控制器和视图的过程称为基架(scaffolding)。基架不是必须的,但是可以省下很多时间。(其实就是代码生成器了)
在创建Controller的对话框中可以选择基架。
Asp.Net MVC中的默认基架可以为应用程序的CRUD生成所需的样板代码。
如果不喜欢默认的代码生成机制,也可以自定义或者使用NuGet搜索scaffolding来查找可替代的模版。
实体框架:
可以从这里学习EF
http://msdn.microsoft.com/en-us/data/aa937723
http://www.cnblogs.com/haogj/archive/2011/05/06/2038965.html
Asp.Net 3 Tool Update之后新建的项目会包含EF4.1,并有基于EF的基架,当然完全可以去掉。
EF是一个ORM框架,不但可以保存.Net对象到数据库,而且可以利用Linq来检索这些数据。
EF4.1支持代码优先,指在不创建数据库、不打开VS设计器的情况下栽Sql Server中存储或检索信息。可以直接编写存.Net类,EF知道如何保存到正确位置。
代码优先风格和Asp.Net MVC一样,遵照了很多的约定来生成数据库。如名为id的属性会被映射为主键,Album会被保存在Albums表中。
适合从0开始编写应用程序。
MVC结合EF的例子:
1、先创建几个模型
public class Album
{public virtual int AlbumId { get; set; }public virtual int GenreId { get; set; }public virtual int ArtistId { get; set; }public virtual string Title { get; set; }public virtual decimal Price { get; set; }public virtual string AlbumArtUrl { get; set; }public virtual Genre Genre { get; set; }public virtual Artist Artist { get; set; }
}
public class Artist
{public virtual int ArtistId { set; get; }public virtual string Name { get; set; }
}
public class Genre
{public virtual int GenreId { set; get; } public virtual string Name{ set; get; }
}

创建的Model属性时候使用virtual不是必须的,但是可以打开EF的一些特性,如高效的修改跟踪机制(对EF没研究,没看懂,过后研究)
2、使用EF的代码优先时需要从EF的DbContext类派生出一个类来访问数据库,在访问数据库时候只需要实例化这个类就行。
派生类具有多个DbSet<T>字段,每个T代表一个要保存的对象,如下(可以不写,在添加Controller时候选择新建,让基架自己生成):
public class MusicStoreDB : DbContext
{public DbSet<Album> Albums { get; set; }public DbSet<Genre> Genres { get; set; }public DbSet<Artist> Artists { get; set; }
}

3、使用自带的基架模版生成代码

4、生成的Controller的代码片段:
private MusicStoreDB db = new MusicStoreDB();public ViewResult Index()
{var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);//预加载return View(albums.ToList());
}[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", "GenreId", album.GenreId);ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);return View(album);
}

Include方法表示采用预加载策略,把关联的数据尽可能的全加载进来。延迟加载的每一条记录在访问子对象时候会往数据库多发出一个额外的查询!

反之是延迟加载:
var albums = db.Albums//延迟加载

 
5、生成的编辑Action代码中,子对象使用ViewBag传值,对应的View子对象使用DropDownList提供选择。
这里可以考虑创建ViewModel,使用强类型视图(没有好不好之说,看是否合适)。
 
6、运行之前需要往web.config里加入一个连接字符串
<connectionStrings><add name="MusicStoreDB"connectionString="data source .................."providerName="System.Data.SqlClient" />
</connectionStrings> 

这样运行起来,数据库中就会自动生成一个对应Model关系的数据库了。
Model和数据库的同步:
如果修改Model,EF要嘛重新创建数据库,要嘛就抛异常。
重建数据库需要提供一个数据库初始化器,如下:
Database.SetInitializer(new DropCreateDatabaseAlways<MusicStoreDB>());
//框架提供两个IDatabaseInitializer的实现类:
//DropCreateDatabaseAlways和DropCreateDatabaseIfModelChanges,见名知意

可以重写IDatabaseInitializer的Seed方法,为生成的数据库添加基本数据。
 
ModelBinder:
MVC框架可以为不同类型的模型注册多个ModelBinder,默认实现是DefaultModelBinder。
DefaultModelBinder将检查参数声明的类型,从请求中将命名符合约定的值注入到一个相应的对象中。
例如,ModelBinder看到参数为Album,而Album有Title属性时,就会在请求中找到名为Title的参数,填入。
ModelBinder使用IValueProvider,在请求的不同区域查找参数。可以查看路由数据、查询字符串、表单数据等,也可自定义IValueProvider,后面章节有。
模型邦定可能存在安全性问题,比如修改到不能修改的属性,叫做over-posting攻击,预防方法后面章节有。
当Action中有参数时候,ModelBinder会隐式工作,也可以使用Controller中的UpdateModel和TryUpateModel方法显示地调用模型 绑定 。这两个方法关系到验证的问题,使用起来和int.Parse与int.TryParse一样。调用 TryUpateModel后直接查看ModelState.IsValid也能查看是否绑定成功。

转载于:https://www.cnblogs.com/rehope/archive/2012/07/15/2592579.html

《ASP.NET MVC3高级编程》学习笔记2相关推荐

  1. 《TensorFlow技术解析与实战》——1.2 什么是深度学习

    本节书摘来异步社区<TensorFlow技术解析与实战>一书中的第1章,第1.2节,作者:李嘉璇,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.2 什么是深 ...

  2. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow 3.1PlayGround

    本节书摘来自异步社区<TensorFlow技术解析与实战>一书中的第3章,第3.1节,作者李嘉璇,更多章节内容可以访问云栖社区"异步社区"公众号查看 第3章 可视化Te ...

  3. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow

    本节书摘来异步社区<TensorFlow技术解析与实战>一书中的第3章,作者:李嘉璇,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第3章 可视化TensorF ...

  4. 《TensorFlow技术解析与实战》——3.1 PlayGround

    本节书摘来异步社区<TensorFlow技术解析与实战>一书中的第3章,第3.1节,作者:李嘉璇,更多章节内容可以访问云栖社区"异步社区"公众号查看. 3.1 Play ...

  5. 《TensorFlow技术解析与实战》——导读

    前言 2017年2月,TensorFlow的首届开发者峰会(2017 TensorFlow Dev Summit)在美国的加利福尼亚州举行.在会上,谷歌公司宣布正式发布TensorFlow 1.0版本 ...

  6. TensorFlow学习笔记——《TensorFlow技术解析与实战》

    著名历史学家斯塔夫里阿诺斯在<全球通史>中,曾以15世纪的航海在"物理上"连通"各大洲"作为标志将人类历史划分为两个阶段.在我正在写作的<互联 ...

  7. 《TensorFlow技术解析与实战》欢迎来到异步社区!

    欢迎来到异步社区! 异步社区的来历 异步社区(www.epubit.com.cn)是人民邮电出版社旗下IT专业图书旗舰社区,于2015年8月上线运营. 异步社区依托于人民邮电出版社20余年的IT专业优 ...

  8. 第127讲:Hadoop集群管理之安全模式解析及动手实战学习笔记

    第127讲:Hadoop集群管理之安全模式解析及动手实战学习笔记 hadoop在启动时namenode会把fsimage加载进内存,同时和edits内容合并,以此建立整个文件系统的元数据的镜像(内存级 ...

  9. “物联网开发实战”学习笔记-(四)智能音箱制作和语音控制

    "物联网开发实战"学习笔记-(四)智能音箱制作和语音控制 这次来造一个属于自己的智能音箱,这里详细介绍了智能音箱的语音控制的实现. 智能音箱的技术架构 智能音箱主要涉及拾音.前端信 ...

  10. “物联网开发实战”学习笔记-(二)手机控制智能电灯

    "物联网开发实战"学习笔记-(二)手机控制智能电灯 如果搭建好硬件平台后,这一次我们的任务主要是调试好智能电灯,并且连接到腾讯云的物联网平台. 腾讯云物联网平台 腾讯物联网平台的优 ...

最新文章

  1. A small tip to explore how to call a method of a control
  2. 【渝粤题库】广东开放大学 大学英语B 形成性考核 (2)
  3. python中request方法_如何使用python语言中的request模块获取代码
  4. va_list函数族应用
  5. Android让控件位于底部
  6. 用 Chrome 扩展实现修改
  7. 如何在官网下载scala
  8. js之金额大小写转换工具类(测试OK)
  9. word使用过程中遇到的问题记录(二):如何画柱状图和折线图的组合图?
  10. 使用Word批量删除换行和空白行
  11. 2020年度十大高薪岗位出炉:程序员霸榜
  12. RoboCup3D仿真2019年国赛TC笔记
  13. MIPI DSI 接口协议介绍
  14. Android系统固件包解包、修改(涉及root提权)、打包
  15. access行列转换。
  16. u盘插入计算机显示被写保护,磁盘提示被写保护怎么办?
  17. Plotly 和 Dash 构建 Python 交互式仪表板类 App
  18. CSS基础-09-布局(定位 position、浮动float,元素对其、图像对其、文本对齐、元素内内容对齐,元素堆叠)
  19. 微信智能机器人助手,基于hook技术,自动聊天机器人
  20. node 项目打包工具ncc

热门文章

  1. git 的右键快捷菜单恢复
  2. 基于keepalived搭建MySQL高可用集群
  3. CSS3 里添加自定义字体
  4. 20160221.CCPP体系详解(0031天)
  5. OOD沉思录 --- 类和对象的关系 --- 使用关系
  6. iOS: 转载CoreData数据库框架
  7. [锋利JQ]-图片提示效果
  8. [Win] 利用Memory DC抽取EXE的图标并保存为BMP文件
  9. Idea debugger 无法启动-unable to open debugger port , java.net.SocketException socket closed
  10. 初识前端——个人总结