ORM即 对象-关系映射(转自:微冷的雨)
ORM即 对象-关系映射:
将数据库中的数据关系表,映射为实体对象。
灵动思绪EF(Entity FrameWork)
很久之前就想写这篇文章了,但是由于种种原因,没有将自己学习的EF知识整理成一片文章。今天我就用CodeFirst和ModelFirst两种方式的简单案例将自己学习的EF知识做个总结。
在讲解EF之前,我们先来看下ORM
ORM全称:(Object-Relation Mapping)即对象-关系映射。ORM是将关系数据库中的业务数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来,实现系统业务逻辑的过程。
ORM简介:
ORM产生背景:
1、操作数据库代码的重复性
在ORM之前我们知道通过ADO.NET可以访问数据库。或者更进一步,学过三层架构的开发人员,知道可以将通过ADO.NET对数据库的操作提取到一个单独的类SqlHelper中,然后在DAL层调用SqlHelper类的方法实现对数据库的操作。即使你这样做了,在数据访问层(DAL)层,还是要写大量的代码,而且我们都知道对数据库的访问无非增、删、改、查四种操作,那么我们很容易想到我们做了大量的重复性工作。只是因为操作的表不同,我们可能需要花费大量的时间编写针对该表的增删改查语句,那么有没有一种方式能自动生成这些语句呢?这样的话,我们就可以吧主要的精力或者更多的时间投入到特殊业务的处理上。
2、大量SQL语句影响程序的扩展性和灵活性
我们知道之前我们编写的程序和数据库之间的耦合性很紧密,如果我们操作的是SQL Server数据库,我们就需要引入对应的类库(SqlConnection等),这样如果需要更换数据库,那么,数据访问层的代码就需要重新书写。
ORM含义:
通过该图,我们可以看出,O对应程序中的类Customer,就是对象,我们知道R含义为Relation,对应数据当中的关系表;M表示程序中对象和数据库中关系表的映射关系。Mapping实际上是一个XML文件
接着我们再来看下面这张图
通过该图,我们可以看出业务实体,在数据库中表现为关系数据,而在内存中表现为对象。应用程序处理对象很容易,但是很难处理关系数据。ORM做到了关系数据和对象数据之间的映射,ORM可以通过映射关系自动产生SQL语句,ORM在业务逻辑层和数据层之间充当桥梁。
ORM核心原则:
1、简单性
2、传达性
3、精确性
ORM优点:
1、面向对象
不用编码,就可以向操作对象一样操作数据库
2、提高开发效率
ORM可以自动对实体对象与数据库中表进行字段与属性的映射,不需要单独的数据访问层就可以对数据进行增删改查。
3、方便转移数据库
当数据库发生改变时,不需要对模型进行改动,只需要修改映射关系就可以 了。
ORM缺点:
1、不够灵活,对于复杂查询,ORM力不从心。
2、执行效率低于直接 编写的SQL语句 。
3、性能损耗,ORM中的映射和关系管理是以牺牲性能为代价的
4、提高了学习成本。
ORM使用场合:
1、对性能要求不是很苛刻的程序
有一个转换的成本
2、开发时间紧迫时
3、有数据库迁移需求时
常见ORM框架
ORM不是产品,是框架的总称,面向对象的程序设计语言到关系数据库的映射。
使程序员既可以利用面向对象语言的简单易用性,又可以利用关系数据库的技术优势来实现应用程序的增删改查操作。
1、NHibernate:Hibernate在.NET平台下的版本
2、iBatis.NET:iBatis在.NET平台的实现
3、Linq to SQL(微软不再更新):.NET针对SQL server的ORM框架
4、ADO.NET Entity Framework:微软在.NET4.0推出的领域驱动开发模型。
注意:ADO.NET Entity Framework是微软以ADO.NET为基础所发展出来的对象关系映射解决方案,只不过是对ADO.NET进行了一个更高层次的封装。
.NET应用程序访问数据库的方式
1、手写代码通过ADO.NET类库
2、DataSet结合DataAdapter结合
3、ORM
ORM解决方案:
Linq to sql
EF:数据库的ER模型可以完全转换成对象模型
EF体系结构
1、Data Providers:数据库的相关操作
2、EDM:概念层和逻辑层的映射,应用程序构建在该层之上
3、其他层:如何操作EDM
接下来,我们来看下EDM的概念
EDM(Entity Data Model):实体数据模型
能将我们对数据对象的操作为对数据库的操作。
在EF中,我们对数据对象的操作,实际上是在操作EDM,
EDM会将对数据对象的操作发送到数据库。
EDM三层:
CSDL(概念层)
定义对象模型,以面向对象的方式访问数据,可以简单理解为实体类
MSL(对应层)
负责上层的概念层结构与下层的存储结构之间的映射
SSDL(存储层)
负责与数据库管理系统中的数据表做实体对应
EF图解:
当我们通过应用程序对数据库执行CRUD时,通过EF方式,实际上是对ObjectContext的操作,ObjectContext相当于EF的入口,ObjectContext拿到对应的消息(CRUD)后,通过ORM中的Mapping来将对象O映射成数据库中的关系R。我们通过一个截图来看下Mapping中存储的内容。
然后我们就来通过CodeFirst的方式实现对数据库的增删改查操作。
CodeFirst方式
首先我们新建一个windows应用程序,然后对项目点击右键,添加新建项,如下图
然后点击添加按钮,
点击下一步,
点击新建连接
然后点击确定按钮,然后点击下一步,
选中表节点,然后点击完成即可。
然后打开项目中的edmx下的Designer.cs文件:
打开上下文节点:
ObjectContext前的类名就是我们所说的上下文。
那么下面我们开始编写代码:
- /* 注意点:数据库中的表必须有主键,如果是模型先行,则模型也c必须有主键。*/
- private void Form1_Load(object sender, EventArgs e)
- {
- // 实现EF第一种方式:CodeFirst:代码先行机制
- /************************ 增加数据***********************/
- //01.创建EF上下文实例
- EFFirstEntities efFirst = new EFFirstEntities();
- #region 新增数据
- ////02.构造出一个实体
- //Student stu = new Student();
- //stu.Name = "张三";
- ////03.将实体对象添加到实体集合中
- //efFirst.Student.AddObject(stu);
- ////04.最后要告诉EM帮我去将数据保存到数据库
- //efFirst.SaveChanges();
- #endregion
- /*************************修改数据************************/
- //02.构造出你要修改的实体
- #region 修改数据
- //Student stu = new Student();
- //stu.Name = "李四";
- //stu.ID = 4;
- ////03.将当前实体用EF进行跟踪
- //efFirst.Student.Attach(stu);
- ////04.将状态设置为Modified
- //efFirst.ObjectStateManager.ChangeObjectState(stu, EntityState.Modified);
- ////05.保存
- //efFirst.SaveChanges();
- #endregion
- /***********************删除数据*************************/
- #region 删除
- //Student stu = new Student();
- //stu.ID = 4;
- ////03.也是要跟踪当前的实体对象
- //efFirst.Student.Attach(stu);
- //efFirst.ObjectStateManager.ChangeObjectState(stu, EntityState.Deleted);
- //efFirst.SaveChanges();
- #endregion
- /***************************查询数据*************/
- //var 语法塘技术
- //foreach (var item in efFirst.Student)
- //{
- // string result = string.Format("ID={0},Name={1}", item.ID, item.Name);
- // MessageBox.Show(result);
- //}
- /****************** ***********通过linq方式查询***********/
- //EF有延迟加载机制 select * from student where 1=1
- //所谓延迟加载机制,当你真正需要数据的时候,EF才帮我们加载
- var list = from c in efFirst.Student
- where c.ID > 1
- select c;
- foreach (var item in list)
- {
- MessageBox.Show(item.Name);
- }
ModelFirst方式:
方式类似,只是需要添加空模型,然后选择数据源,过程不再赘述。
然后我们看下实现代码。
- ModelFirstStudentContainer modelFirst = new ModelFirstStudentContainer();
- /*******************************添加************************************************/
- Customer customer = new Customer() { CName = "李小龙", CRemark = "功夫影星" };
- modelFirst.Customer.AddObject(customer);
- Order order1 = new Order() { OrderContent = "双节棍", Customer = customer, OrderDate = DateTime.Now };
- modelFirst.Order.AddObject(order1);
- Order order2 = new Order() { OrderContent = "布棍", Customer = customer, OrderDate = DateTime.Now };
- modelFirst.Order.AddObject(order2);
- modelFirst.SaveChanges();
- /*************************************查询*************************************/
- var temp = from c in modelFirst.Customer
- where c.Order.Count >= 2
- select c;
- foreach (var item in temp)
- {
- foreach (var o in item.Order)
- {
- MessageBox.Show(o.OrderContent);
- }
- }
- /*********************************修改********************************************/
- Customer cust = new Customer(){CID = 1,CName = "小李",CRemark = "英雄"};
- modelFirst.Customer.Attach(cust);
- modelFirst.ObjectStateManager.ChangeObjectState(cust, EntityState.Modified);
- modelFirst.SaveChanges();
- /*********************************删除***********************************************/
- var temp = from c in modelFirst.Order
- where c.Customer.CID == 1
- select c;
- foreach (var item in temp)
- {
- modelFirst.Order.DeleteObject(item);
- }
- Customer cust = new Customer()
- {
- CID=1
- };
- modelFirst.Customer.Attach(cust);
- modelFirst.ObjectStateManager.ChangeObjectState(cust, EntityState.Deleted);
- modelFirst.SaveChanges();
这次就讲到这里,我们用两种方式:代码先行和模型方式通过EF对数据库中数据进行了操作。
ORM即 对象-关系映射(转自:微冷的雨)的更多相关文章
- Python学习---django之ORM语法[对象关系映射]180124
ORM语法[对象关系映射] ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作. 优点:1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句.快速开发. 2 ...
- Django——Django中的QuerySet API 与ORM(对象关系映射)
首先名词解释. ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型 ...
- ORM框架(对象关系映射)
Entity Framework 学习初级篇1--EF基本概况 http://www.cnblogs.com/xray2005/archive/2009/05/07/1452033.html ORM ...
- 优酷项目之 ORM(数据库对象关系映射)代码重写
前言: 我们在操作数据库时候一般都是通过sql代码来操作mysql数据库中相关数据,这就需要懂得sql语句,那么怎么样才能在不懂sql语句的情况下通过我们所学的python代码来实现对mysql数据库 ...
- ORM概述(对象关系映射)
ORM概述: ORM(Object-Relational Mapping)表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到加你对象与数据库 ...
- [Python之路] ORM(对象关系映射)
一.概念 ORM是Python后端Web框架Django的核心思想,"Object Relational Mapping",即对象-关系映射,简称ORM. 一句话理解就是: 创建一 ...
- ORM:对象关系映射
一.简单操作 定义:面向对象和关系型数据库的一种映射,通过操作对象的方式操作数据 对应关系: 类对应数据表 对象对应数据行(记录) 属性对应字段 导入:from app01 import models ...
- python之ORM(对象关系映射)
实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要更改代码.orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句.所有使用Django开发的项目无需关心程序底层使用的 ...
- ORM对象关系映射
ORM 总结: ORM:对象关系映射 作用: 1.将定义数据库模型类--> 数据库表 2.将定义数据库模型类中的属性--->数据库表字段 3.将模型对象的操作(add,delete,com ...
随机推荐
- es let2
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- delphi 一个自动控制机的硅控板检测程序,用多线程和API,没有用控件,少做改动就能用 用485开发
一个自动控制机的硅控板检测程序,用多线程和API,没有用控件,少做改动就能用Unit CommThread; Interface Uses Windows, Classes, SysUtils, G ...
- python——argsort函数
numpy中argsort函数用法,有需要的朋友可以参考下. 在Python中使用help帮助 >>> import numpy >>> help(numpy.ar ...
- Android sqlite数据库自定义存放路径办法参考(未验证)
public class TestDB extends SQLiteOpenHelper { private static final String DATABASE_NAME = "use ...
- 第一周:Java基础知识总结(1)
1.软件开发的基本步骤: 1.分析问题,建立数据模型. 2.确定数据结构类型和算法. 3.编写程序. 4.调试程序. 2.Java语言 Java是一种简单的.面向对象的.分布式的.解释的.安全的.可移 ...
- iOS 8潜在的取证问题
Apple于今天正式发布了iOS 8推送升级 大概琢磨了一下: 1. 可以确定,iOS 7中存在的File relay等所谓后门服务已经被修正,目前Oxygen和我们采用这种服务提取的功能将不再适用于 ...
- [转]CIDR简介
IP Subnetting and Variable Length Subnet Masks Subnetting Basics 子网划分(subnetting)的优点: 1.减少网络流量 2.提高网 ...
- .Net中的泛型(where T : class的含义)
Eg: class A<T>where T:new() where表明了对类型变量T的约束关系.where T: A表示类型变量是继承于A的,或者是A本身.where T:new()指明了 ...
- [JavaScript]配置日期选择控件
我选择的日期控件是:bootstrap-datepicker(下载路径:https://github.com/Aymkdn/Datepicker-for-Bootstrap) 比较方便,实用.原来是英 ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...