ASP.NET开发实战——(九)ASP.NET MVC 与数据库之ORM
之前的文章中介绍了如何在ASP.NET中通过ADO.NET操作SQL Server和My SQL数据库,数据库的操作是通过SQL语句的执行来完成的,在ASP.NET中还有一个简便的方式来使用数据库,那就是通过Entity Framework这个ORM组件。EF操作数据的原理也是最终生成SQL来执行。
本文将从以下几个方面来完成Entity Framework的介绍:
●什么是ORM
●Entity Framework
●使用EF Code First操作数据库
什么是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
欢迎添加个人微信号:Like若所思。
欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

ASP.NET开发实战——(九)ASP.NET MVC 与数据库之ORM的更多相关文章
- ASP.NET开发实战——(八)ASP.NET MVC 与数据库之MySQL
之前介绍了My Blog如何使用ADO.NET来访问SQL Server获取数据.本章将介绍如何使用My SQL来完成数据管理. 在使用My SQL之前需确保开发环境中安装了My SQL数据库和Con ...
- ASP.NET开发实战——(二)为什么使用ASP.NET
本文主要内容是通过分析<博客系统>需求,确定使用Web应用的形式来开发,然后介绍了HTML.HTTP的概念,并使用IIS搭建了一个静态的HTML“页面”,从而引出“动态”的ASP.NET. ...
- ASP.NET开发实战——(五)ASP.NET MVC & 分层
上一篇文章简要说明了MVC所代表的含义并提供了详细的项目及其控制器.视图等内容的创建步骤,最终完成了一个简单ASP.NET MVC程序. 注:MVC与ASP.NET MVC不相等,MVC是一种开发模式 ...
- ASP.NET开发实战——(六)ASP.NET MVC & 分层 代码篇
上一篇文章对如何规范使用ASP.NET进行了介绍,本章内容将根据上一篇得出的结论来修改博客应用的代码. 代码分层 综合考虑将博客应用代码分为以下几个层次: ○ 模型:代表应用程序中的数据模型,与数据库 ...
- ASP.NET开发实战——(四)ASP.NET MVC是如何运行的?它的生命周期是什么?
前面的文章我们使用ASP.NET MVC创建了个博客应用,那么它是如何工作的呢?我们都知道ASP.NET的程序需要部署到IIS上才能够通过浏览器来访问,那么IIS与ASP.NET MVC程序之间又是如 ...
- ASP.NET开发实战——(十)ASP.NET MVC 与数据库之MySQL&EF
之前介绍EF时介绍了provider这个配置项,而且也介绍了在ASP.NET访问MySQL数据仍然是通过ADO.NET,不同的地方仅仅是更换了MySQL的数据提供器,那么在EF中是否也只需更换“提供器 ...
- ASP.NET开发实战——(十二)ASP.NET MVC 与数据库之Entity Framework Migrations
在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...
- ASP.NET开发实战——(十一)ASP.NET MVC 与数据库之EntityFramework配置与连接字符串
前几篇文章中介绍了如何使用Entity Framework来操作数据库,但是对EF的配置.连接字符串的指定仍然存在一些疑问,EF可以通过两种方式来实现配置,分别是代码方式和配置文件. 本章将通过以下几 ...
- ASP.NET开发实战——(十三)ASP.NET MVC 与数据库之EF实体类与数据库结构
大家都知道在关系型数据库中每张表的每个字段都会有自己的属性,如:数据类型.长度.是否为空.主外键.索引以及表与表之间的关系.但对于C#编写的类来说,它的属性只有一个数据类型和类与类之间的关系,但是在M ...
随机推荐
- hebust-fengyu
三人行必有我师焉,择其善者而从之,其不善者而改之. 入则无法家拂士,出则无敌国外患者,国恒亡,然后知生于忧患而死于安乐也. 狡兔死走狗烹,飞鸟尽良弓藏,敌国尽谋臣亡 今齐地方千里,百二十城,宫妇左右莫 ...
- The Three Rules/Laws of TDD
You are not allowed to write any production code unless it is to make a failing unit test pass. 除非为了 ...
- 基于Django的Rest Framework框架的视图组件
本文目录 一 基本视图 二 mixin类和generice类编写视图 三 使用generics 下ListCreateAPIView,RetrieveUpdateDestroyAPIView 四 使用 ...
- Java连载46-Java中的多态
一.多态的语法 1.关于多态中涉及到几个概念 (1)向上转型(upcasting) 子类型转换为父类型,又被称为自动类型转换 (2)向下转型(downcasting) 父类型转换为子类型,又被称为强制 ...
- centos6和centos7的防火墙基本命令
一.centos6: 1.firewall的基本启动/停止/重启命令 $查看防火墙状态: service iptables status (/etc/init.d/iptables status) $ ...
- Java设计模式:Flyweight(享元)模式
概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...
- Oracle - v$lock查询慢原因分析
数据库内部对象X$统计信息过旧,导致v$lock查询慢 前段时间用python写了个zabbix监控脚本,里面有一个检查锁的sql语句,sql语句是这样子的select count(*) retval ...
- node.js如何批量赋值
1. 数组解析赋值 let a = 1; let b = 2; let c = 3; 等同于 let [a, b, c] = [1, 2, 3]; 默认值 let [a, b = "B&qu ...
- GO 键盘输入和打印输出
键盘输入和打印输出 一.打印输出 1.1 fmt包 fmt包实现了类似C语言printf和scanf的格式化I/O.格式化verb('verb')源自C语言但更简单. 详见官网fmt的API:http ...
- VMWare虚拟机应用介绍
目录 一:VMWare简介 二:VMWare启动第一个虚拟机 一:VMWare简介 VMWare虚拟机软件是一个"虚拟PC"软件,它使你可以在一台机器上同时运行二个或更多Win ...