什么是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. FTP的主动和被动模式详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp25 主动模式FTP与被动模式FTP该如何选择 一.主动模式的实现与特点. ...

  2. 03-TypeScript中的强类型

    在js中不能定义类型,而是根据赋值后,js运行时推断类型.在ts中支持强类型,强类型包括string.number(浮点型,不是整型).boolean.any(任意类型).Array<T> ...

  3. mysql初学,mysql修改,mysql查找,mysql删除,mysql基本命令

    Mysql 下载地址https://dev.mysql.com/downloads/mysql/ 1.连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYS ...

  4. ★电车难题的n个坑爹变种

    哲学家都不会做的电车难题变异 此题会答清华北大 "电车难题(Trolley Problem)"是伦理学领域最为知名的思想实验之一,其内容大致是: 一个疯子把五个无辜的人绑在电车轨道 ...

  5. CCIE-MPLS基础篇-实验手册

    又一部前期JUSTECH(南京捷式泰)工程师职业发展系列丛书完整拷贝. MPLS(Multi-Protocol Label Switching) 目录 1:MPLS 基础实验.... 1.1实验拓扑. ...

  6. 201521123084 《Java程序设计》第4周学习总结

    第4周作业-面向对象设计与继承 1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 总结: (1)学会了如何给类和方法进行简单的注释: (2)学 ...

  7. spring 注入使用注解(不用xml)

    (一):导入spring4的jar包 (二):在xml中配置扫描的包 <context:component-scan base-package="entity">< ...

  8. 201521123089 《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 总结: (1)类名的首字母一定要大写. (2)制类型转换:类强制转换为子类时只有当引用类型真 ...

  9. 201521123027 《JAVA程序设计》第3周学习总结

    1.本周学习总结 2.书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pu ...

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

    1. 本章学习总结 1.final声明,一旦赋值不能被改变.移位运算符的应用,负数右移高位补"1",正数右移高位补"1".利用移位运算,按位与运算可以方便得出整 ...