找回密码
 立即注册
首页 业界区 业界 灵动思绪EF(Entity FrameWork)

灵动思绪EF(Entity FrameWork)

事确 2025-5-29 16:25:37
很久之前就想写这篇文章了,但是由于种种原因,没有将自己学习的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含义:
1.jpeg

 
通过该图,我们可以看出,O对应程序中的类Customer,就是对象,我们知道R含义为Relation,对应数据当中的关系表;M表示程序中对象和数据库中关系表的映射关系。Mapping实际上是一个XML文件
接着我们再来看下面这张图
2.jpeg

通过该图,我们可以看出业务实体,在数据库中表现为关系数据,而在内存中表现为对象。应用程序处理对象很容易,但是很难处理关系数据。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体系结构
3.jpeg

1, Data Providers:数据库的相关操作

2, EDM:概念层和逻辑层的映射,应用程序构建在该层之上

3, 其他层:如何操作EDM

接下来,我们来看下EDM的概念
EDM(Entity  Data   Model):实体数据模型
4.jpeg

能将我们对数据对象的操作为对数据库的操作。
在EF中,我们对数据对象的操作,实际上是在操作EDM,
5.jpeg

EDM会将对数据对象的操作发送到数据库。
EDM三层:
CSDL(概念层)
定义对象模型,以面向对象的方式访问数据,可以简单理解为实体类
MSL(对应层)

负责上层的概念层结构与下层的存储结构之间的映射
SSDL(存储层)
负责与数据库管理系统中的数据表做实体对应
7.jpeg

EF图解:
8.jpeg

当我们通过应用程序对数据库执行CRUD时,通过EF方式,实际上是对ObjectContext的操作,ObjectContext相当于EF的入口,ObjectContext拿到对应的消息(CRUD)后,通过ORM中的Mapping来将对象O映射成数据库中的关系R。我们通过一个截图来看下Mapping中存储的内容。
 
9.jpeg

然后我们就来通过CodeFirst的方式实现对数据库的增删改查操作。
CodeFirst方式
首先我们新建一个windows应用程序,然后对项目点击右键,添加新建项,如下图
10.jpeg

然后点击添加按钮,
11.jpeg

点击下一步,
12.jpeg

点击新建连接
13.jpeg

然后点击确定按钮,然后点击下一步,
14.jpeg

选中表节点,然后点击完成即可。
然后打开项目中的edmx下的Designer.cs文件
15.jpeg

打开上下文节点,
16.jpeg

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

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

然后我们看下实现代码。
  1. 1  ModelFirstStudentContainer modelFirst = new ModelFirstStudentContainer();
  2. 2             /*******************************添加************************************************/
  3. 3             Customer customer = new Customer() { CName = "李小龙", CRemark = "功夫影星" };
  4. 4             modelFirst.Customer.AddObject(customer);
  5. 5             Order order1 = new Order() { OrderContent = "双节棍", Customer = customer, OrderDate = DateTime.Now };
  6. 6             modelFirst.Order.AddObject(order1);
  7. 7
  8. 8             Order order2 = new Order() { OrderContent = "布棍", Customer = customer, OrderDate = DateTime.Now };
  9. 9             modelFirst.Order.AddObject(order2);
  10. 10             modelFirst.SaveChanges();
  11. 11             /*************************************查询*************************************/
  12. 12             var temp = from c in modelFirst.Customer
  13. 13                        where c.Order.Count >= 2
  14. 14                        select c;
  15. 15             foreach (var item in temp)
  16. 16             {
  17. 17                 foreach (var o in item.Order)
  18. 18                 {
  19. 19                     MessageBox.Show(o.OrderContent);
  20. 20                 }
  21. 21             }
  22. 22             /*********************************修改********************************************/
  23. 23             Customer cust = new Customer(){CID = 1,CName = "小李",CRemark = "英雄"};
  24. 24             modelFirst.Customer.Attach(cust);
  25. 25             modelFirst.ObjectStateManager.ChangeObjectState(cust, EntityState.Modified);
  26. 26             modelFirst.SaveChanges();
  27. 27             /*********************************删除***********************************************/
  28. 28             var temp = from c in modelFirst.Order
  29. 29                        where c.Customer.CID == 1
  30. 30                        select c;
  31. 31             foreach (var item in temp)
  32. 32             {
  33. 33                 modelFirst.Order.DeleteObject(item);
  34. 34             }
  35. 35             Customer cust = new Customer()
  36. 36             {
  37. 37                 CID=1
  38. 38             };
  39. 39            
  40. 40             modelFirst.Customer.Attach(cust);
  41. 41             modelFirst.ObjectStateManager.ChangeObjectState(cust, EntityState.Deleted);
  42. 42             modelFirst.SaveChanges();
复制代码
这次就讲到这里,我们用两种方式:代码先行和模型方式通过EF对数据库中数据进行了操作。
 


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册