什么是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. Entity Framework Core 2.0 数据库迁移

    看见过几篇其他大神写的关于EFCore2.0的文章.本人有点小白,一开始看文档的时候除了一些基本操作外其他部分几乎没有读懂,我估计会有一部分人跟我一样,因为人家读懂了的早就懂了. 在这里我写一下我自己 ...

  2. 数据库学习任务四:数据读取器对象SqlDataReader、数据适配器对象SqlDataAdapter、数据集对象DataSet

    数据库应用程序的开发流程一般主要分为以下几个步骤: 创建数据库 使用Connection对象连接数据库 使用Command对象对数据源执行SQL命令并返回数据 使用DataReader和DataSet ...

  3. GIF、JPEG 和 PNG的区别在哪…

    原文地址:GIF.JPEG 和 PNG的区别在哪里?作者:苗得雨 GIF.JPEG 和 PNG 是三种最常见的图片格式. GIF:1987 年诞生,常用于网页动画,使用无损压缩,支持 256 种颜色( ...

  4. JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象

       前   言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学, ...

  5. 团队作业4——第一次项目冲刺(Alpha版本) 日志集合处

    第一天(2017.4.23) http://www.cnblogs.com/1413none/p/6752325.html 第二天(2017.4.24) http://www.cnblogs.com/ ...

  6. 微信小程序简单入门理解

    简单的小程序示例结构: (一):理解小程序结构app.js,app.json,app.wxss ①app.js,app.json是小程序结构必要的部分,app.wxss可选择 ②app.js用于创建小 ...

  7. 201521123002《Java程序设计》第11周学习总结

    作业参考文件 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5 ...

  8. 多线程面试题系列(6):经典线程同步 事件Event

    上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...

  9. 12.Linux之输入子系统分析(详解)

    版权声明:本文为博主原创文章,转载请标注出处:   在此节之前,我们学的都是简单的字符驱动,涉及的内容有字符驱动的框架.自动创建设备节点.linux中断.poll机制.异步通知.同步互斥/非阻塞.定时 ...

  10. Python学习笔记004_字典_集合

    >>> # 字典 用大括号表示, 它是影射类型,相当于java中的Map >>> >>> dict1 = {'李宁': '一切皆有可能', '耐克 ...