您的位置:首页 > 其它

【转载】ADO.NET与ORM的比较(4):EntityFramework实现CRUD

2014-12-11 19:08 363 查看
【转载】ADO.NET与ORM的比较(4):EntityFramework实现CRUD

说明:个人感觉在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类,如下图所示:

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);
}
}
}


View Code
上面的代码在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语句查询,多种访问方法为我们在不同场合下使用提供了方便,在此特别说明EntitySQL目前版本只支持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;在中国的相当部分程序员不用太关注性能问题,因为他们开发的产品从投入使用到最后停止运行过程中产生的数据单表记录超过百万的都不多。
如何选择合适的技术,取决于我们队将要运行的环境的判断,这来自于经验分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: