灵动思绪EF(Entity FrameWork)

参考页面:

http://www.yuanjiaocheng.net/entity/mode-first.html

http://www.yuanjiaocheng.net/entity/database-first.html

http://www.yuanjiaocheng.net/entity/choose-development-approach.html

http://www.yuanjiaocheng.net/entity/query-with-edm.html

http://www.yuanjiaocheng.net/entity/linq-to-entities-projection.html

很久之前就想写这篇文章了,但是由于种种原因,没有将自己学习的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             #endregion
 34
 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.将状态设置为Modified
 52
 53             //efFirst.ObjectStateManager.ChangeObjectState(stu, EntityState.Modified);
 54
 55             ////05.保存
 56
 57             //efFirst.SaveChanges();
 58
 59             #endregion
 60
 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             #endregion
 80
 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对数据库中数据进行了操作。

时间: 2024-12-16 09:51:38

灵动思绪EF(Entity FrameWork)的相关文章

EF(Entity Framework)通用DBHelper通用类,增删改查以及列表

(1)通用类用法 其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo>(); 3 UserInfo userinfo = new UserInfo(); 4 userinfo.Name = "1"; 5 dbhelper.Add(userinfo); 6 7 //根据条件查找列表 8 var entityes = dbhelper.F

EF Entity Framework Core DBContext中文文档

Add(Object) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. Add<TEntity>(TEntity) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. AddAsync(Object, CancellationToken) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的

EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:

解决方案: 禁止上下创建. 修改.删除,默认为true public DataDbContext() : base("name=DataDbContext") {  this.Database.Initialize(false); }

Entity Framework 学习

Entity Framework 学习初级篇1--EF基本概况... 2 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍... 7 Entity Framework 学习初级篇3-- LINQ TOEntities. 10 Entity Framework 学习初级篇4--EntitySQL. 17 Entity Framework 学习初级篇5--ObjectQ

[Programming Entity Framework] 第3章 查询实体数据模型(EDM)(一)

http://www.cnblogs.com/sansi/archive/2012/10/18/2729337.html Programming Entity Framework 第二版翻译索引 你可以使用各种方法查询实体数据模型.你选择有些方法是因为个人喜好,而其它的则是因为你可以利用特殊的效益.你很有可能已经听过LINQ to Entities和Entity SQL.你可以使用特殊的方法去查询,比如某些基于LINQ,而其它的基于EF的ObjectQuery类.这此查询方法中的每一个都会产生具

Entity Framework 泛型使用

因为增删改查是我们常用到的方法,我们不可能每个数据模型都去完成增删改查,这样的办法太笨拙了.我们可以写个父类(包含增删改查),然后让所有的数据模型类继承该父类.那就要求我们的父类必须使用泛型来实现. 1 using System; 2 using System.Collections.Generic; 3 using System.Data.Entity.Infrastructure; 4 using System.Linq; 5 using System.Linq.Expressions; 6

Entity Framework之Code First

EF(Entity Framework )是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping (对象关系映射(Object RelationalMapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.)) 解决方案. Entity Framework利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性 (property),关系则转换为结合属性(association),让数据

实体框架(Entity Framework)

实体框架(Entity Framework) 实体框架(Entity Framework)简介 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,最新版本是EF6.0[CodeOnly功能得到了更好的支持] 实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术.是微软的一个ORM框架. EF插入实体 步骤:定义要

让EF飞一会儿:如何用Entity Framework 6 连接Sqlite数据库

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 获取Sqlite 1.可以用NuGet程序包来获取,它也会自动下载EF6 2.在Sqlite官网上下载对应的版本:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.