说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具来操作数据。在.NET中操作数据库的方式有多种,除了最直接的方式就是使用ADO.NET之外,还可以使用NHibernate这个Hibernate在.NET中的实现ORM,如果你对第三方的ORM持怀疑态度,你还可以使用来自微软的实现、根正苗红的Linq或者EntityFramework。
 大部分从早期就开始使用.NET开发的程序员可能对ADO.NET有种迷恋,使用ADO.NET可以充分将我们早期的SQL知识发挥得淋漓尽致,并且出于对性能的考虑,有些人对.NET中的ORM还保持一种观望态度,包括我自己也是这种态度。不过即使在实际开发中不用,并不代表我们不能去了解和比较这些技术,任何事物的出现和消亡总有其原因的,我们可以了解它们的优点和长处。所以本人抽出了几个周末的时间分别用ADO.NET、NHibernate、Linq和EntityFramework来实现对数据库单表数据的创建、读取、更新和删除操作,也就是所谓的CRUD(C:Create/R:Read/U:Update/D:Delete)。
 通过实现相同功能的比较,大家自己判断那种方式更适合自己。需要说明的是,如果在VS2008中使用EntityFramework就需要安装VS2008SP1。
 在本篇讲述的ADO.NET Entity Framework(简称Entity Framework或者干脆称之为EF),在本系列涉及到的几种ORM框架中Entity Framework出现得最晚,在自然界往往遵循着这样一个规律:出现得越晚的生命力越强。特别是编程语言,新出现的语言往往都是为了克服当前主流语言的不足而出现的,就想同样是OOP语言,Java在很多方面就比C++表现优秀,C#又表现得比Java语言一些,这都是因为新的语言都是在借鉴了现有语言的优点并摒弃它们的不足而产生的。在这一点上Entity Framework也是如此。
一、准备
 向当前项目中添加ADO.NET Entity Framework类,如下图所示:

 点击“添加”之后如下图所示:

 选择“从数据库生成”,然后点击“下一步”,如下图所示:

 如果已经存在数据库连接,就从中选择一个连接,否则就需要新建一个连接。点击“新建连接”之后的界面如下:

 这其实就是一个配置数据库连接的界面,填写正确的数据库连接之后点击“确定”按钮,如下图所示:

 选择需要的表、视图及存储过程,并填写模型的命名空间,之后点击“完成”,这样就完成了添加ADO.NET Entity Framework模型文件。
 双击刚才添加的模型文件,就可以在设计视图中打开,如下图所示:

 我们还可以在设计视图的下方编辑它的属性,如下图所示:

 如果以后数据库结构发生了变化,也可以很容易根据数据库来刷新模型文件,如下图所示:

 至此,我们完成了初步工作,向当前项目中添加了模型文件。
二、编码
 和使用Linq to SQL一样,在创建edmx文件时自动创建了相关的实体类代码,因此我们只需根据业务逻辑编写对数据库操作的类即可,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.EntityClient;
using System.Configuration;

namespace EntityFrameworkDemo
{
/// <summary>
/// 说明:这个类是为了演示.NET中的Entity Framework的用法
/// 作者:周公(周金桥)
/// 日期:2010-05-05
/// </summary>
public class EntityFrameworkCRUD
         {
/// <summary>
/// 统计用户总数
/// </summary>
/// <returns> </returns>
public int Count()
                 {

#region 方法二,使用Linq to Entities
using (AspNetStudyEntities entities = new AspNetStudyEntities())
         {
//entities.UserInfo.Count<UserInfo>(item => item.Age > 23);//带条件查询
return entities.UserInfo.Count<UserInfo>();
            }
                         #endregion


                 }
/// <summary>
/// 创建用户
/// </summary>
/// <param name= "info" > 用户实体 </param>
/// <returns> </returns>
public void Create(UserInfo info)
                 {
using (AspNetStudyEntities entities = new AspNetStudyEntities())
         {
                         entities.AddToUserInfo(info);
                         entities.SaveChanges();
            }
                 }
/// <summary>
/// 读取用户信息
/// </summary>
/// <param name= "userId" > 用户编号 </param>
/// <returns> </returns>
public UserInfo Read( int userId)
                 {
//AspNetStudyEntities entities = new AspNetStudyEntities();
//return entities.UserInfo.First<UserInfo>(item => item.UserID == userId);

方法二,使用EntityKey #region 方法二,使用EntityKey
using (AspNetStudyEntities entities = new AspNetStudyEntities())
         {
                         EntityKey entityKey = new EntityKey( "AspNetStudyEntities.UserInfo" , "UserID" ,userId);
return entities.GetObjectByKey(entityKey) as UserInfo;
            }
                         #endregion
                 }
/// <summary>
/// 更新用户信息
/// </summary>
/// <param name= "info" > 用户实体 </param>
/// <returns> </returns>
public void Update(UserInfo info)
                 {
using (AspNetStudyEntities entities = new AspNetStudyEntities())
         {
                         UserInfo ui = entities.UserInfo.First<UserInfo>(item => item.UserID == info.UserID);
                         ui.Age = info.Age;
                         ui.Email = info.Email;
                         ui.Mobile = info.Mobile;
                         ui.Phone = info.Phone;
                         ui.RealName = info.RealName;
                         ui.Sex = info.Sex;
                         ui.UserName = info.UserName;
                         entities.SaveChanges();
            }
                 }
/// <summary>
/// 删除用户
/// </summary>
/// <param name= "userId" > 用户编号 </param>
/// <returns> </returns>
public void Delete( int userId)
                 {
#region 方法二
using (AspNetStudyEntities entities = new AspNetStudyEntities())
         {
                         UserInfo ui = entities.UserInfo.First<UserInfo>(item => item.UserID == userId);
                         entities.DeleteObject(ui);
                         entities.SaveChanges();
            }
                         #endregion
                 }

/// <summary>
/// 删除用户
/// </summary>
/// <param name= "userId" > 用户实体 </param>
/// <returns> </returns>
public void Delete(UserInfo info)
                 {
using (AspNetStudyEntities entities = new AspNetStudyEntities())
         {
                         UserInfo ui = entities.UserInfo.First<UserInfo>(item => item.UserID == info.UserID);
                         entities.DeleteObject(ui);
                         entities.SaveChanges();
            }
                 }

/// <summary>
/// 获取用户表中编号最大的用户
/// </summary>
/// <returns> </returns>
public int GetMaxUserId()
                 {
using (AspNetStudyEntities entities = new AspNetStudyEntities())
         {
int userId=entities.UserInfo.Max<UserInfo>(item => item.UserID);
return userId;
            }
                 }
         }
}

三、单元测试代码
 为了照顾很多仍在使用NUnit作为单元测试工具的开发人员的习惯,我们的单元测试代码针对NUnit2.5.3,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using EntityFrameworkDemo;

namespace NUnitTest
{
         [TestFixture]
class EntityFrameworkTest
         {
private EntityFrameworkCRUD instance = null ;
                 [SetUp]
public void Initialize()
                 {
                         instance = new EntityFrameworkCRUD();
                 }
                 [Test]
/// <summary>
/// 统计用户总数
/// </summary>
/// <returns> </returns>
public void Count()
                 {
                         Assert.Greater(instance.Count(), 0);
                 }
                 [Test]
/// <summary>
/// 创建用户
/// </summary>
/// <param name= "info" > 用户实体 </param>
/// <returns> </returns>
public void Create()
                 {
                         UserInfo info = new UserInfo()
                         {
                                 Age=12,
                                 Email= "zzz@ccav.com" ,
                                 Mobile= "13812345678" ,
                                 Phone= "01012345678" ,
                                 RealName = "测试" + DateTime.Now.Millisecond.ToString(),
                                 Sex= true ,
                                 UserName= "zhoufoxcn" +DateTime.Now.Millisecond.ToString()
                         };
                         instance.Create(info);
                 }
                 [Test]
/// <summary>
/// 读取用户信息
/// </summary>
/// <param name= "userId" > 用户编号 </param>
/// <returns> </returns>
public void Read()
                 {
                         UserInfo info = instance.Read(1);
                         Assert.NotNull(info);
                 }
                 [Test]
/// <summary>
/// 更新用户信息
/// </summary>
/// <param name= "info" > 用户实体 </param>
/// <returns> </returns>
public void Update()
                 {
                         UserInfo info = instance.Read(1);
                         info.RealName = "测试" + DateTime.Now.Millisecond.ToString();
                         instance.Update(info);
                 }
                 [Test]
/// <summary>
/// 删除用户
/// </summary>
/// <param name= "userId" > 用户编号 </param>
/// <returns> </returns>
public void DeleteByID()
                 {
int userId = instance.GetMaxUserId();
                         instance.Delete(userId);
                 }

                 [Test]
/// <summary>
/// 删除用户
/// </summary>
/// <param name= "userId" > 用户实体 </param>
/// <returns> </returns>
public void Delete()
                 {
int userId = instance.GetMaxUserId();
                         UserInfo info = instance.Read(userId);
                         Console.WriteLine( "userid={0},username={1}" , info.UserID, info.UserName);
                         instance.Delete(info);
                 }
         }
}

  上面的代码在NUnit2.5.3中测试通过。
四、总结
 同样作为微软的ORM框架,我觉得Linq to SQL更像一个探路的,试探一下大家对官方ORM的反应,正因为如此Linq to SQL在对数据库种类的支持上仅仅支持SQL Server,但是作为一个产品系列Linq to XML、Linq to SQL让大家对XML和数据库的访问更加方便了,因此得到了很多开发人员的追捧。而ADO.NET Entity Framework由于出现较晚的原因(在.NET Framework SP1及更高版本中支持),所以对Linq to SQL的某些不足进行了改进,并且还提供了Linq to Entities技术。
 在ADO.NET Entity Framework提供了四种访问数据库的方法:Linq to Entitiess、Entity SQL、EntityKey及直接对数据库用SQL语句查询,多种访问方法为我们在不同场合下使用提供了方便,需要特别说明的是Entity SQL目前仅支持SELECT操作,而不支持CREATE/DELETE/UPDATE操作,具体出处见: How Entity SQL Differs from Transact-SQL
 从性能上考虑,对于拥有丰富数据库开发经验的程序员来说,使用ORM确实会比直接使用SQL语句要性能低些,因为不管是Linq to Entitiess还是Entity SQL都最终会转换成SQL交给ADO.NET执行,肯定比直接使用ADO.NET执行SQL语句要慢。对于没有经验的开发人员来说,它们之间差别不大——反正都是很慢。
 从开发速度和灵活性上考虑,使用ORM框架比使用ADO.NET开发速度要高,而且假如数据库发生了变化对代码的影响也较小(尽管没有人会频繁改变数据库折腾自己,但是在开发阶段更改数据库的可能性仍是存在的,毕竟不可能让设计做到百分之百完美),当然对数据库操作的灵活性是ADO.NET胜出了。
 从可维护性上考虑,使用ADO.NET因为灵活性大所以不同的程序员实现同样的功能可能代码相差较大,而使用同一种ORM框架时这种代码上的差别不会太大,便于维护。
 以前我一直拒绝ASP.NET MVC,而一直使用自己习惯的三层架构开发模式,在网站前台尽可能少的使用服务器控件更多地是采用模板替换法或者生成静态页面、在后台则尽可能使用服务器控件,这么做的目的是出于前台访问的用户数大、后台访问用户数少所以在前台尽可能使用运行高效的方式而在后台尽可能采取高效的开发方式。直到去年的时候维护别人的一个项目,我才逐渐体会到MVC的好处,那就是控制起来灵活并且维护起来相对方便一些。
 如果仅仅追求运行效率,那么只有机器语言就足够了;如果除此之外还希望能兼顾一下开发效率,那么C足够了;如果除此之外还希望兼顾一下代码重用,那么C++也能满足了;如果除此之外,还希望更健壮避免直接操作内存,那么Java也是可以的;如果除此之外还希望更多更灵活的功能,那么C#是可以的......
 总之,每一种后出现的新生事物都是借鉴了它的前辈成功之处的,特别是在前辈的最成功之处,但是由于在某些地方太过关注,所以它在其它方面又会有一些不足,但是这些不足又是可以通过其它方式相对较容易解决的,甚至在某些情况下根本可以忽略。比如在中国大部分的程序员不用太关注是否提供跨平台支持,因为中国大部分公司都是用的Windows;在中国的相当部分程序员不用太关注性能问题,因为他们开发的产品从投入使用到最后停止运行过程中产生的数据单表记录超过百万的都不多。
 如何选择合适的技术,取决于我们队将要运行的环境的判断,这来自于经验分析。
 周公
 2010-05-05

本文出自 “ 周公的专栏 ” 博客,请务必保留此出处 http://zhoufoxcn.blog.51cto.com/792419/313309

转载于:https://www.cnblogs.com/1971ruru/archive/2012/02/29/2373707.html

ADO.NET与ORM的比较(4):EntityFramework实现CRUD相关推荐

  1. ADO.NET与ORM的比较(5):MyBatis实现CRUD

    说明:这是一个系列文章,在前面的四篇当中周公分别讲述了利用ADO.NET.NHibernate.Linq to SQL及EntityFramework来实现CRUD功能(C:Create/R:Read ...

  2. mybatis.net mysql_ADO.NET与ORM的比较(5):MyBatis实现CRUD

    说明:这是一个系列文章,在前面的四篇当中周公分别讲述了利用ADO.NET.NHibernate.Linq to SQL及EntityFramework来实现CRUD功能(C:Create/R:Read ...

  3. python下的orm基本操作(1)--Mysql下的CRUD简单操作(含源码DEMO)

    最近逐渐打算将工作的环境转移到ubuntu下,突然发现对于我来说,这ubuntu对于我这种上上网,收收邮件,写写博客,写写程序的时实在是太合适了,除了刚接触的时候会不怎么完全适应命令行及各种权限管理, ...

  4. Web APi之EntityFramework【CRUD】(三)

    前言 之前我们系统学习了EntityFramework,个人觉得有些东西不能学了就算完了,必须要学以致用,在Web API上也少不了增(C).删(D).改(U).查(R).鉴于此,我们通过EF来实现W ...

  5. 基于 EntityFramework 的数据库主从读写分离架构(1) - 原理概述和基本功能实现...

    回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramework\Maste ...

  6. ORM系列之Entity FrameWork详解

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

  7. 【转】ORM系列之Entity FrameWork详解

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

  8. ASP .NET MVC ORM概述

    大中型软件开发过程中常会使用到ORM技术,ORM全称是"对象-关系映射".ORM是将关系数据库中的数据用对象的形式表现出来,     并通过面向对象的方式将这些对象组织起来,实现系 ...

  9. vue.js crud_ASP.NET CORE —从零到英雄学习ADO.NET中的CRUD操作

    vue.js crud ADO.NET ASP.NET Core中的CRUD操作 在此ASP.NET Core教程中,您将从一开始就学习在ADO.NET中进行CRUD操作. 本教程将帮助您学习ADO. ...

最新文章

  1. 请大佬们多给运维人员思考和决策的权利
  2. 网站权重增长缓慢,优化技巧是关键!
  3. [转]样式篇之如何实现合并单元格效果
  4. 卷死了!再不学vue3就没有人要你了!速来围观vue3新特性
  5. python调用带参函数_Python | 带有示例的函数调用类型
  6. vue设置页面标题title
  7. TikZ学习笔记(一) 基本图形
  8. 全球首发!计算机视觉Polygon Mesh Processing总结9——Triangle-Based Remeshing
  9. kube-proxy修改成ipvs模式
  10. windows和linux通过网线连接,用网线连接Windows和Linux台式机,并实现Linux共享Windows的WiFi网络...
  11. 10小时,就能吃透Kafka源码?
  12. team网卡配置_Linux中多个网卡配置(team的配置方式)
  13. MPQ Storm库 源码分析 一
  14. SOLIDWORKS生成URDF文件后部分文件散乱分布
  15. at android.widget.Toast$TN$1.handleMessage(java.lang.IllegalStateException)
  16. 上twitter_如何在Twitter上更改您的显示名称
  17. Oracle数据库(五)用户 ,角色,权限
  18. (转)A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
  19. iOS 指南针的制作 附带源码
  20. 2022 年度作品优秀大赏 | 开发者说·DTalk

热门文章

  1. SGU 210 Acdream 1227 Beloved Sons KM
  2. [Android]对MVC和MVP的总结
  3. 用正则表达式抽取文本
  4. mac下修改mysql连接数_MySQL最大连接数设置
  5. hello python jpush_Python人脸识别 + 手机推送,老板来了你就会收到短信提示
  6. Python检验某个字符(串)是否属于另一个字符串
  7. excel html modify,Modify excel cell
  8. PHP统计链接跳转的次数,如何在PHP页面统计某链接的点击数
  9. sd卡测速工具_怎样恢复SD卡数据?教你两招轻松恢复
  10. 测试面试题集-Python三局两胜小游戏