ORM即 对象-关系映射(转自:微冷的雨)

ORM即 对象-关系映射:

将数据库中的数据关系表,映射为实体对象。

灵动思绪EF(Entity FrameWork)

作者: 微冷的雨  来源: 博客园  发布时间: 2013-01-22 16:28  阅读: 10119 次  推荐: 16   原文链接   [收藏]

  很久之前就想写这篇文章了,但是由于种种原因,没有将自己学习的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对数据库中数据进行了操作。

时间: 2024-10-26 02:55:58

ORM即 对象-关系映射(转自:微冷的雨)的相关文章

Django——Django中的QuerySet API 与ORM(对象关系映射)

首先名词解释. ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”. 面向对象是从软件工程基本原则(如耦合.聚合.封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别.为了解决这个不匹配的现象,对象关系映射技术应运而生. 对象关系映射(Obj

手撸系列之——ORM(对象关系映射)

ORM:对象关系映射 类 >>> 数据库的一张表 对象 >>> 表的一条记录 对象点属性 >>> 记录某一个字段对应的值 废话不多少,先上代码: # orm.py from mysql_singletion import Mysql # 设置表字段类,通常需要的属性为字段名,字段类型,是否为主键,默认值 class Field(object): def __init__(self,name,column_type,primary_key,default

ActiveAndroid:活性记录的风格ORM(对象关系映射)

http://hao.jobbole.com/activeandroid/?utm_source=hao.jobbole.com&utm_medium=relatedResources

对象关系映射(ORM)

对象-关系映射(Object Relational Mapping,简称ORM,对象关系映射)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中.本质上就是将数据从一种形式转换到另外一种形式. 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数

ORM对象关系映射框架基本搭建

一 概念 1 概念 ORM :对象关系映射,对象和关系之间的映射,使用面向对象的方式来操作数据库 关系对象模型和python对象模型之间的映射 tabel => class ,表映射类 row => object ,行映射为实例 column=> property ,字段映射属性 2 举例 表有login,字段为id int , username varchar, age int 映射到python为 #!/usr/bin/poython3.6 #conding:utf-8 class

死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>博文中,探讨的是如何聚焦领域模型(抛开一些干扰因素,才能把精力集中在领域模型的设计上)?需要注意的是,上一篇我讲的并不是如何设计领域模型(本篇也是)?而是如何聚焦领域模型,领域模型的设计是个迭代过程,不能一概而论,还在路上. 当有一个简单的领域模型用例,完成一个从上而下过程的时候,就需要对领域模型和数据库进行对象关系

Hibernate (开源对象关系映射框架)

一.基本介绍1.它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm(对象关系映射)框架,hibernate可以自动生成SQL语句,自动执行: Hibernate可以应用在任何使用JDBC的场合. 2.持久化层:处理关系型数据库(数据存储层)和模型对象(object,业务逻辑模型)的映射关系的代码方法(ORM)3.Hibernate是一个基于JDBC的主流持久化框架,对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码,是一个优秀的

ORM : 对象关系映射

ORM 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”.

Hibernate -- xxx.hbm.xml ORM元数据 表对象关系映射文件

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- ORM元数据 表对象关系映射文件 p