很久之前就想写这篇文章了,但是由于种种原因,没有将自己学习的EF知识整理成一片文章。今天我就用CodeFirst和ModelFirst两种方式的简单案例将自己学习的EF知识做个总结。
在讲解EF之前,我们先来看下ORM
ORM全称:(Object-Relation Mapping)即对象-关系映射。ORM是将关系数据库中的业务数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来,实现系统业务逻辑的过程。
ORM简介:
ORM产生背景:
- 操作数据库代码的重复性
在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 > 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 >=
select c;
foreach (var item in temp)
{
foreach (var o in item.Order)
{
MessageBox.Show(o.OrderContent);
}
}
/*********************************修改********************************************/
Customer cust = new Customer(){CID = ,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 ==
select c;
foreach (var item in temp)
{
modelFirst.Order.DeleteObject(item);
}
Customer cust = new Customer()
{
CID=
}; modelFirst.Customer.Attach(cust);
modelFirst.ObjectStateManager.ChangeObjectState(cust, EntityState.Deleted);
modelFirst.SaveChanges();
这次就讲到这里,我们用两种方式:代码先行和模型方式通过EF对数据库中数据进行了操作。
博客来自:微冷的雨的《灵动思绪EF(Entity FrameWork)》
[转载]灵动思绪EF(Entity FrameWork)的更多相关文章
-
EF(Entity Framework)多对多关系下用LINQ实现";NOT IN";查询
这是今天在实际开发中遇到的一个问题,需求是查询未分类的博文列表(未加入任何分类的博文),之前是通过存储过程实现的,今天用EF实现了,在这篇博文中记录一下. 博文的实体类BlogPost是这样定义的: ...
-
EF(Entity Framework)通用DBHelper通用类,增删改查以及列表
其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo& ...
-
EF ( Entity Framework) 操作ArcCataLog 生成的(Sql Server)空间数据库
因为项目需求,现在需要利用EF 操作由Arccatalog生成的sql server空间数据库..在此之前,一直没有接触过空间数据库,在操作空间数据库时 绕了许多弯... 因此写一篇随笔做一个总结. ...
-
EF Entity Framework Core DBContext中文文档
Add(Object) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. Add<TEnt ...
-
[EF] - Entity Framework 6处理User Defined Function(UDF SQL Server)
随着EF5的发布,新增了对数据库(SQL Server) UDF的支持,具体可以看以下的连接:https://msdn.microsoft.com/en-us/data/hh859577.aspx,新 ...
-
EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
解决方案: 禁止上下创建. 修改.删除,默认为true public DataDbContext() : base("name=DataDbContext") { this.Da ...
-
Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF
Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF Entity FrameWork的特点 1.支持多种数据库(MSSQL.Oracle.M ...
-
Entity Framework 学习
Entity Framework 学习初级篇1--EF基本概况 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry. ...
-
Entity Framework插入数据报错:Validation failed for one or more entities
www.111cn.net 编辑:lanve 来源:转载 今天在处理Entity Framework插入数据库时,报错: Validation failed for one or more entit ...
随机推荐
-
git基本操作
一.在Windows平台上安装Git,可以下载一个msysGit的安装包,点击exe即可安装运行.安装包下载地址:https://git-for-windows.github.io/备注:git命令行 ...
-
第26天 swift reflect
1.reflect http://www.jianshu.com/p/b5c87824e33c 2.android studio 2.0项目1.5编译 Cause: com/android/build ...
-
C/C++代码静态分析插件 SourceInsight_Scan
sourceinsight-scan 是一款集成在 SourceInsight 中的c/c++代码静态分析插件,集成了cppcheck,coverity,pclint等业界优秀的静态分析工具的优点. ...
-
持续集成:TestNG组织如何测试用例 1
持续集成:TestNG组织如何测试用例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90 ...
-
一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
-
PHP客服聊天
1.基于workman框架 github:https://github.com/walkor/workerman-chat 文档:http://www.workerman.net/gatewaydoc ...
-
配置STP、RSTP以及负载均衡
生成树协议是一种二层管理协议,它通过有选择性地阻塞网络冗余链路来达到消除网络二层环路的目的,同时具备链路的备份功能. 每个VLAN都生成一棵树是一种比较直接,而且最简单的解决方法.它能够保证每一个VL ...
-
交叉编译环境以及开发板上-/bin/sh: ./hello: not found 转载自 http://blankboy.72pines.com
交叉编译环境以及开发板上-/bin/sh: ./hello: not found 目标板是S3C2440.至于交叉编译环境的搭建就不多说了,网上很多教程. 搭建好了交叉编译环境后,第一件事就是传说中的 ...
-
linux新增特性timerfd
https://blog.csdn.net/shreck66/article/details/49745149
-
2017Noip普及组游记
Day0 一天都基本在休息,早上信心赛,大家都是400整. 下午一群人窝在教室里打三国杀. Day1:Before Contest 早上大约十点到了试场,在考提高组,不能进. 喝了一杯咖啡去除早起的身 ...