参考资料《ASP.NET MVC5 高级编程》第5版
第4章 模型
本章所探讨的模型是要显示、保存、创建、更新和删除的对象。
基架指使用 MVC 提供的工具为每个模型对象的标准索引构建、创建、编辑和删除功能构建控制器和视图。这个构建工作称为基架(scaffolding)。
4.1 建模
4.2 构造基架
新建的ASP.NET MVC5 项目会自动包含对实体类框架(EF) 的引用。EF 是一个对象关系映射(object-relational mapping)框架。它知道如何在关系型数据库中保存.NET 对象,还可以利用LINQ 查询语句检索保存在关系型数据库中的.NET 对象。
EF 支持数据库有限、 代码优先和模型优先的开发风格;MVC 基架采用的是代码优先的风格。
EF 需要知道模型属性值的修改时刻,因为它要在这一刻生成一个UPDATE 语句,使这些改变与数据库保持一致。
4.2.2 基架和实体框架
1,代码优先约定
EF 对于外键关系,数据库名称等也有约定。这些约定取代了以前需要提供给一个关系对象映射框架的所有映射和配置。
2,DbContext 类
当使用EF的代码优先方法时,需要使用从EF 的DbContext 类派生出来的一个类来访问数据库。该派生类有一个或多个DbSet <T> 属性,类型中的每一个T 代表一个想要持久保存的对象。
4.2.3 执行基架模板
加载相关对象
- 预加载是使用查询语句加载所有数据。
- 延迟加载是加载时只加载主要对象数据。
4.2.4 执行基架代码
1,用实体框架创建数据库
可以使用两种方式控制上下文的数据库连接。
- 预加载是使用查询语句加载所有数据。
- 延迟加载是加载时只加载主要对象数据。
_MigrationHistory 表
_MigrationHistory 为每次迁移存储代码优先模型的一个压缩版本,从而允许按照需要在各个版本之间迁移数据库。
2.使用数据库初始化器
当我们使用SetInitializer 方法时,需要向其中传一个 IDatabaseInitializer 对象,而框架中自带两个IDatabaseInitializer对象:DropCreateDatabaseAlways 和 DropCreateDatabaseIfModelChanges。
3.播种数据库
调用重写基类的 Seed 方法会将新对象保存到数据库中。
tips:
为免在同一个数据库上多次运行种子方法时添加重复数据。在EF4.3 及更高版本中可以使用DbSet.AddOrUpdate()扩展方法。
4.3 编辑
4.3.1 创建编辑的资源
Edit 视图
当用户点击 form 中的 submit 按钮时,HTML 将发送一个HTTP POST 请求。
4.3.2 响应编辑时的POST 请求
如果模型处于有效状态,Edit 操作将执行以下代码:db.Entry(album).State=EntityState.modified; 这段代码是告诉数据库上下文,该对象在数据库中已存在。
如果模型无效,或数据错误,需要给用户返回错误信息,以便用户改正自身产生的错误。
4.4 模型绑定
4.4.1 DefaultModelBinder
over-posting 攻击:改变不期望被改变的值
4.4.2 显式模型绑定
可以使用控制器中的UpdateModel和TryUpdateModel 方法显式的调用模型绑定。
参考资料《ASP.NET MVC5 高级编程》第5版