灵动思绪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前的类名就是我们所说的上下文。

那么下面我们开始编写代码:

        

复制代码

  1  /*  注意点:数据库中的表必须有主键,如果是模型先行,则模型也c必须有主键。2 3          */4 5         private void Form1_Load(object sender, EventArgs e)6 7         {8 9             // 实现EF第一种方式:CodeFirst:代码先行机制10 11             /************************ 增加数据***********************/12 13             //01.创建EF上下文实例14 15             EFFirstEntities efFirst = new EFFirstEntities();16 17             #region 新增数据18 19             02.构造出一个实体20 21             //Student stu = new Student();22 23             //stu.Name = "张三";24 25             03.将实体对象添加到实体集合中26 27             //efFirst.Student.AddObject(stu);28 29             04.最后要告诉EM帮我去将数据保存到数据库30 31             //efFirst.SaveChanges();32 33             #endregion34 35            /*************************修改数据************************/36 37            //02.构造出你要修改的实体38 39             #region 修改数据40 41             //Student stu = new Student();42 43             //stu.Name = "李四";44 45             //stu.ID = 4;46 47             03.将当前实体用EF进行跟踪48 49             //efFirst.Student.Attach(stu);50 51             04.将状态设置为Modified52 53             //efFirst.ObjectStateManager.ChangeObjectState(stu, EntityState.Modified);54 55             05.保存56 57             //efFirst.SaveChanges();58 59             #endregion60 61            62 63             /***********************删除数据*************************/64 65             #region 删除66 67             //Student stu = new Student();68 69             //stu.ID = 4;70 71             03.也是要跟踪当前的实体对象72 73             //efFirst.Student.Attach(stu);74 75             //efFirst.ObjectStateManager.ChangeObjectState(stu, EntityState.Deleted);76 77             //efFirst.SaveChanges();78 79             #endregion80 81  82 83             /***************************查询数据*************/84 85             //var 语法塘技术86 87             //foreach (var item in efFirst.Student)88 89             //{90 91             //    string result = string.Format("ID={0},Name={1}", item.ID, item.Name);92 93             //    MessageBox.Show(result);94 95             //}96 97             /****************** ***********通过linq方式查询***********/98 99            //EF有延迟加载机制  select * from student where 1=1
100 
101             //所谓延迟加载机制,当你真正需要数据的时候,EF才帮我们加载
102 
103             var list = from c in efFirst.Student
104 
105                        where c.ID > 1
106 
107                        select c;
108 
109  
110 
111             foreach (var item in list)
112 
113             {
114 
115                 MessageBox.Show(item.Name);
116 
117             }

复制代码

ModelFirst方式:

 方式类似,只是需要添加空模型,然后选择数据源,过程不再赘述。

然后我们看下实现代码。

复制代码

 1  ModelFirstStudentContainer modelFirst = new ModelFirstStudentContainer();2             /*******************************添加************************************************/3             Customer customer = new Customer() { CName = "李小龙", CRemark = "功夫影星" };4             modelFirst.Customer.AddObject(customer);5             Order order1 = new Order() { OrderContent = "双节棍", Customer = customer, OrderDate = DateTime.Now };6             modelFirst.Order.AddObject(order1);7 8             Order order2 = new Order() { OrderContent = "布棍", Customer = customer, OrderDate = DateTime.Now };9             modelFirst.Order.AddObject(order2);
10             modelFirst.SaveChanges();
11             /*************************************查询*************************************/
12             var temp = from c in modelFirst.Customer
13                        where c.Order.Count >= 2
14                        select c;
15             foreach (var item in temp)
16             {
17                 foreach (var o in item.Order)
18                 {
19                     MessageBox.Show(o.OrderContent);
20                 }
21             }
22             /*********************************修改********************************************/
23             Customer cust = new Customer(){CID = 1,CName = "小李",CRemark = "英雄"};
24             modelFirst.Customer.Attach(cust);
25             modelFirst.ObjectStateManager.ChangeObjectState(cust, EntityState.Modified);
26             modelFirst.SaveChanges();
27             /*********************************删除***********************************************/
28             var temp = from c in modelFirst.Order
29                        where c.Customer.CID == 1 
30                        select c;
31             foreach (var item in temp)
32             {
33                 modelFirst.Order.DeleteObject(item);
34             }
35             Customer cust = new Customer() 
36             {
37                 CID=1
38             };
39             
40             modelFirst.Customer.Attach(cust);
41             modelFirst.ObjectStateManager.ChangeObjectState(cust, EntityState.Deleted);
42             modelFirst.SaveChanges();

 

这次就讲到这里,我们用两种方式:代码先行和模型方式通过EF对数据库中数据进行了操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

json qbytearray 串 转_JSON数据采集网关,json转Modbus RTU串IO口RS485转4~20mA边缘计算智能终端...

JSON数据采集网关边缘计算智能终端是一种能够将各种传感器仪表仪器设备的数据采集后按照JSON格式上传服务器的网关,可以实现云边协同。JSON(JavaScript Object Notation)是java中的数据格式。例如{“Energy”:”100”, “time”:”22:22:15”}这样的格式&#xff0c…

ABP入门系列(3)——领域层定义仓储并实现

一、先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。 在ABP中,仓储类要实现IRepository接口,接口定义了常用的增删改查以及…

XCIE-HUAWEI-PBR-MQC-引入形成的路由环路

XCIE-HUAWEI-PBR-MQC-引入形成的路由环路 首先来个测试 给你们选,答案选啥呢? 正确答案在结尾公布 正确答案是C 为什么呢? 首先,虽然ACL有一个齐总是拒绝的,但是呢,他两都是同一条路由 但是呢!&#x…

ABP入门系列(5)——展现层实现增删改查

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 这一章节将通过完善Controller、View、ViewModel,来实现展现层的增删改查。最终实现效果如下图: 展现层最终效果 一、定义Controller ABP对ASP.NET MVC Controlle…

限制会话id服务端不共享_不懂 Zookeeper?看完不懂你打我

高并发分布式开发技术体系已然非常的庞大,从国内互联网企业使用情况,可发现RPC、Dubbo、ZK是最基础的技能要求。关于Zookeeper你是不是还停留在Dubbo注册中心的印象中呢?还有它的工作原理呢?经典应用场景呢?对前面三个…

防抖与节流方案_前端ajax优化解决方案

伴随着前端ajax的应用场景越来越多,那就免不了一个整合的ajax优化解决方案了,自己优化太麻烦?没事,有它帮你解决:hajax 与当下比较热门的请求库 axios 和原生的 fetch相比,hajax有什么一些什么内容和特点呢…

ABP入门系列(6)——定义导航菜单

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 完成了增删改查以及页面展示,这一节我们来为任务清单添加【导航菜单】。 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这…

ABP入门系列(7)——分页实现

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 完成了任务清单的增删改查,咱们来讲一讲必不可少的的分页功能。 首先很庆幸ABP已经帮我们封装了分页实现,实在是贴心啊。 来来来,这一节咱们就来捋一捋如…

下载matlab安装包太慢_Matlab2017a软件安装包以及安装教程

安装步骤:1.如图所示,完整的安装包应该有13个压缩包,必须要全部下载完成才能解压。鼠标右击“thMWoMaR17a.part01.rar”压缩包,选择“解压到thMWoMaR17a”,然后等待解压完成2.打开“thMWoMaR17a”文件夹,解…

【转】ORM系列之Entity FrameWork详解

一. 谈情怀 从第一次接触开发到现在(2018年),大约有六年时间了,最初阶段连接数据库,使用的是【SQL语句ADO.NET】,那时候,什么存储过程、什么事务 统统不理解,生硬的将SQL语句传入SQL…

springcloud 微服务鉴权_Java微服务框架spring cloud

Spring Cloud是什么Spring Boot 让我们从繁琐的配置文件中解脱了出来,而 Spring Cloud,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,…

ABP入门系列(9)——权限管理

1.引言 完成了简单的增删改查和分页功能,是不是觉得少了点什么? 是的,少了权限管理。既然涉及到了权限,那我们就细化下任务清单的功能点: 登录的用户才能查看任务清单用户可以无限创建任务并分配给自己,但…

c#quartz触发_SpringBoot集成Quartz实现定时任务

1 需求在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计。我的设计是按天统计每种状态的比例。为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态。另外,考虑到学生的请…

ABP入门系列(10)——扩展AbpSession

一、AbpSession是Session吗? 1、首先来看看它们分别对应的类型是什么? 查看源码发现Session是定义在Controller中的类型为HttpSessionStateBase的属性。 public HttpSessionStateBase Session { get; set; } 再来看看AbpSession是何须类也&#xff0c…

太吾绘卷第一世攻略_耽美推文-BL-仿佛在攻略一只河豚

目录:《全能攻略游戏》by公子如兰《无限升级游戏》by暗夜公主《无限游戏》BY SISIMO《请听游戏的话》by木兮娘《游戏,在线直播》by雨田君《最强游戏制作人》by木兰竹《在逃生游戏里撩宿敌》by临钥《游戏加载中》by龙柒《狩猎游戏》by砯涯《当异性参加逃生…

ABP入门系列(11)——编写单元测试

1. 前言 In computer programming, unit testing is a software testing method by which individual units of source code, sets of one or more computer program modules together with associated control data, usage procedures, and operating procedures, are tested …

etl构建数据仓库五步法_带你了解数据仓库的基本架构

数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。其实数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用&a…

ABP入门系列(12)——如何升级Abp并调试源码

1. 升级Abp 本系列教程是基于Abp V1.0版本,现在Abp版本已经升级至V1.4.2,其中新增了New Feature,并对Abp做了相应的Enhancements,以及Bug fixs。现在我们就把它升级至最新版本,那如何升级呢? 下面就请按我…

聚类分析在用户行为中的实例_看完这篇,你还敢说不懂聚类分析?

点击上方蓝色字关注我们~大数据分析中的应用,最常用的经典算法之一就是聚类法,这是数据挖掘采用的起步技术,也是数据挖掘入门的一项关键技术。什么是聚类分析?聚类分析有什么用?聚类算法有哪些?聚类分析的应…

ABP入门系列(13)——Redis缓存用起来

1. 引言 创建任务时我们需要指定分配给谁,Demo中我们使用一个下拉列表用来显示当前系统的所有用户,以供用户选择。我们每创建一个任务时都要去数据库取一次用户列表,然后绑定到用户下拉列表显示。如果就单单对一个demo来说,这样实…