好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

灵动思绪EF(Entity FrameWork)

灵动思绪EF(Entity FrameWork)

很久之前就想写这篇文章了,但是由于种种原因,没有将自己学习的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前的类名就是我们所说的上下文。

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

        

   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对数据库中数据进行了操作。

 

 

 

 

标签:  Entity FrameWork 灵动思绪

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于灵动思绪EF(Entity FrameWork)的详细内容...

  阅读:50次