什么是ORM

  对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。(百度百科)。
  Object-relational mapping (ORM, O/RM, and O/R mapping tool) in computer science is a programming technique for converting data between incompatible type systems using object-oriented programming languages.(wikipedia)
  以上两个解释的核心点都在于“面向对象”、“不同类型系统”、“数据转换”,对于使用ASP.NET MVC开发的应用程序来说,开发语言C#就是一个面向对象编程语言,定义的实体类Post就是一个失血模型(只有属性没有方法)对象。而数据库系统与博客系统是两个不同的系统,对于数据库系统来说它将数据看成由数字或字符串构成的一张张表格,而面向对象语言所开发的程序将数据看作一个个实例,表格数据和实例数据是不兼容的,所以需要转换,如之前的代码:

  

  在之前的代码中,通过自己编写代码的方式完成了转换,既然ORM是一种程序技术,那么在ASP.NET中是如何体现的呢?

Entity Framework

  Entity Framework(EF)是一个对象关系映射器,它让.Net开发人员可以使用领域对象来操作关系数据,并帮助开发人员省略大部分访问数据的代码。
如何使用Entity Framework?
  在介绍如何使用EF之前,先了解一下EF的几种工作流,它们如下图所示:

  

  ● 模型优先(创建一个新的数据库):
    ○ 在设计器中创建模型。
    ○ 通过模型创建数据库。
    ○ 通过模型自动生成实体类。

  ● 数据库优先(使用已存在的数据库):
    ○ 在设计器中反向工程模型。
    ○ 通过模型自动生成实体类。

  ● 代码优先(新数据库):
    ○ 在代码中定义实体类和映射(如类和表的映射、属性和表列的映射)。
    ○ 通过模型创建数据库。
    ○ 使用Migrations去更新数据库(结构)。

  ● 代码优先(使用已存在数据库):
    ○ 在代码中定义实体类和映射(如类和表的映射、属性和表列的映射)。
    ○ 或者使用反向工程生成实体类和映射。

使用EF Code First操作数据库

  对于本系列文章仅对代码优先(Code First)做介绍(*^_^*)/
  现在Blog代码中已经存在实体类并且已经存在数据库和对应的数据表,所以不需要再创建。
  1. 通过Nuget获取Entity Framework库:
  因为BlogRepository是管理数据存储的库,所以应该将EntityFramework安装到该项目上:

    

  2. 创建DBContext类型:
  DBContext是EF中的核心类型,EF中的从数据库获取数据填充到实体对象、变化跟踪以及将数据持久化到数据库都是有DBContext完成的。而创建一个DBContext最常用的方法就是继承DbContext类型来实现,DbContext类型位于EntityFramework程序集下的System.Data.Entity命名空间下:

  

  

  3. 在实体中添加DbSet属性:
  DbSet属性代表指定类型的一个数据集合,所有对数据的添加、删除、修改、查询都是通过这个属性实现的。

  

  4. 通过构造方法给DbContext指定数据库连接字符串:

  

  5. 将BlogRepository替换成BlogContext操作数据库:

  

  注:别忘记添加Linq命名空间来使用对数据集合的操作。

  6. 运行程序(查看博客列表页面):

  

  出错了,错误信息显示找不到名称为“System.Data.SqlClient”的ADO.NET提供器,为什么?

  在使用Nuget安装EF的时候会自动在Web.config或者App.config中创建一下配置信息:

  

  在本例中EF安装到了BlogRepository类库项目上,所以程序在启动时是无法读取到这些配置信息的,但要注意的是错误信息的重点在于“找不到ADO.NET Provider”而不是找不到配置信息。所以实际上这个问题的根本原因在于安装EF组件后,默认会添加EntityFramework.dll以及EntityFramework.SqlServer.dll两个库文件的引用,但是由于EF没有安装到启动项目上,所以在项目编译时只会复制主项目依赖的程序集,以及被依赖程序集使用到的程序集。就是说BlogRepository只用到了EntityFramework.dll而没有使用到EntityFramework.SqlServer.dll所以后者没有在主项目的bin目录下,所以仅需要将该程序集复制到MVC项目的bin目录下即可运行:

  

  

  注:EF是基于“约定优先于配置”原则,所以EF的默认约定就是使用SQL SERVER,所以在这里如果没有特殊的需求,没有配置信息EF也是能够正常运行的,更多关于EF配置的介绍会在后续章节中完成。

小结:

  本章主要介绍了ASP.NET中的ORM框架Entity Framework,并且演示了如何安装EF、创建DbContext和DbSet并使用它们访问数据库。使用EF后相比起之前获取数据库数据代码已经少了很多,一句代码就可以完成数据的获取功能,大大的提高了开发效率。

  在本文中有一个要注意的问题就是EF是间接被主项目使用的,所以一些与EF有关的功能如更新数据库(update-database)以及数据库迁移(migration)命令的使用都会与EF在被主项目直接使用有所区别,关于EF的更多内容将在后续文章中介绍。

参考:

  https://msdn.microsoft.com/en-us/library/aa937723(v=vs.113).aspx

  https://msdn.microsoft.com/en-us/library/ee712907(v=vs.113).aspx

本文地址:http://www.cnblogs.com/selimsong/p/7651602.html

ASP.NET没有魔法——目录

ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM的更多相关文章

  1. ASP.NET没有魔法——ASP.NET MVC 与数据库大集合

    ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...

  2. ASP.NET没有魔法——ASP.NET MVC IoC

    之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...

  3. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  4. ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  5. ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理

    ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...

  6. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)

    上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...

  7. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

    对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...

  8. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 ASP.NET没有魔法——ASP.NET MVC界面美化及使用Bundle完成静态资源管理

    ASP.NET没有魔法——ASP.NET MVC Razor与View渲染   对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的 ...

  9. ASP.NET没有魔法——ASP.NET 身份验证与Identity

    前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...

  10. ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证

    ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...

随机推荐

  1. ios 初体验<页面切换>

    本章类容:介绍如何新建一个页面,打开另一个页面 1.在前面中,在工程Appdelegate.m 里面程序第一个走的方法,新建一个窗口,视图,控制器,可视化等, 2.然后在ViewController. ...

  2. JavaScript中你所不知道的Object(一)

    Object实在是JavaScript中很基础的东西了,在工作中,它只有那么贫瘠的几个用法,让人感觉不过尔尔,但是我们真的了解它吗? 1. 当我们习惯用 var a = { name: 'tarol' ...

  3. web切图的几个快捷键及总结

      自由的控制视图系列 自由的浏览图片:按住空格后,鼠标拖动 自由的缩放图片:按住alt+滚轮 切换到实际像素(100%):Ctrl + 1 工作区类型切换:Tab 控制内容系列 通过画面上点选一个图 ...

  4. Python中os和shutil模块实用方法集…

    Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...

  5. 手机设备访问PC页面如果跳转到手机页面?

    //例如:iphone访问www.baidu.com自动跳转到wap.baidu.com,只需在pc端模版页面引入以下js代码//pc zhuan mobile var mobileAgent = n ...

  6. js数组、内置对象、自定义对象

    [js中的数组] 1.数组的基本概念? 数组是在内存空间中连续存储的一组有序数据的集合 元素在数组中的顺序,称为下标.可以使用下表访问数字的每个元素. 2.如何声明一个数组? ① 使用字面量声明: 在 ...

  7. Beta阶段事后诸葛亮分析

    1.总结的提纲内容 a. 项目管理之事后诸葛亮会 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要解决用户无意识花钱,无法清楚看见钱去 ...

  8. Windows环境下JDK的下载与安装

    根据极客学院上的网课做的学习笔记,网课地址:http://www.jikexueyuan.com/course/205.html 1.首先检查一下本机是否有安装java.按win+R,在弹出窗口中输入 ...

  9. 201521123054 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? ping c ...

  10. 201521123117 《Java程序设计》第10周学习总结

    1. 本周学习总结 2.2. 书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 只要try执行了之后,finall ...