参考资料《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版

ASP.NET MVC5 第4章的更多相关文章

  1. ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

    参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...

  2. ASP.NET MVC5 高级编程 第3章 视图

    参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...

  3. ASP.NET MVC5 高级编程 第2章 控制器

    参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...

  4. ASP.NET MVC5 高级编程-学习日记-第一章 入门

    1.1 ASP.NET MVC 简介 ASP.NET是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. 1.1.1 MVC模式 ...

  5. ASP.NET MVC5 与EF6学习系列

    最近学习使用MVC5和EF6,博客园搜索了一番,写下这篇文章记录,以便学习使用. 一.ASP.NET MVC5 网站开发 @洞庭夕照写的博客系列 ASP.NET MVC5 网站开发实践 - 概述 AS ...

  6. ASP.NET MVC5 入门

    参考资料<ASP.NET MVC5 高级编程>第5版 第1章 入门 1.1 ASP.NET MVC 简介 ASP.NET MVC是一种构建Web 应用程序的框架,它将一般的MVC(Mode ...

  7. ASP.NET MVC5(一):ASP.NET MVC概览

    ASP.NET MVC概览 ASP.NET MVC是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. 1.ASP.NET MV ...

  8. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)

    前言 朋友们, 大家好,我还是Rector,写ASP.NET MVC 5系列文章[一步一步创建ASP.NET MVC5程序Repository+Autofac+Automapper+SqlSugar] ...

  9. 探索ASP.NET MVC5系列

    探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)     探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)     探索ASP.NET MV ...

随机推荐

  1. Python补充02 Python小技巧

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在这里列举一些我使用Python时积累的小技巧.这些技巧是我在使用Python过程 ...

  2. Log4net中的RollingFileAppender z

    Log4日志组件的应用确实简单实用,在比较了企业库和Log4的日志功能后,个人觉得Log4的功能更加强大点.补充说明下,我使用的企业库是2.0版本,Log4net是1.2.1版本的. 在Log4net ...

  3. vi命令的使用

    <转:http://linux.vbird.org/linux_basic/0310vi.php> 基本上 vi 共分为三种模式,分别是『一般模式』.『编辑模式』与『指令列命令模式』. 圖 ...

  4. javascript的关于刷新页面给出提示框的代码

    // 页面刷新事件 ,或者关闭事件的3中方法!测试都可以!参考官方文档: https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHan ...

  5. 理论沉淀:RANSAC算法

    1.解决问题: 当一组样本数据中含有(较小波动的)正常数据(inliers)和(较大波动的)异常数据(outliers)且异常数据的量还不小于正常数据的量时,用最小二乘法将难以获得期望的直线(即能拟合 ...

  6. [SQL] cast 与 convert 都在什么情况下使用

    CONVERT(data_type,expression[,style]) 说明: 此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,ch ...

  7. [DataTable] datatable根据表中的字段进行排序

    private DataTable SortTable(DataTable dt,string[] pids) { DataTable dt0 = dt.Clone(); //复制原表结构 ;i< ...

  8. Sq server 关于存储过程,触发器的一些理论简述

    http://www.doc88.com/p-2905916227462.html      

  9. IOS学习之路-- 指针&宏函数

    如果*p被()包住,说明指针变量p将来指向的是函数 //声明一个指针变量 //int (*p)(int, int) = sum; int (*p)(int, int); p = sum; // 如果* ...

  10. 学习Webservice之入天气小试

    主要方法是:通过程序中设置代理用公司内网访问外部Webservice public InputStream getSoapInputStream(String url) { InputStream i ...