您的位置:首页 > 数据库

ado.net EF与ado.net区别比较、在EF中使用执行sql语句

2016-03-30 12:59 495 查看
ado.net EF作为微软的一个ORM框架,通过实体、关系型数据库表之间的映射,使开发人员可以通过操作表实体而间接的操作数据库,大大的提高了开发效率。

这样一来,.net平台下,我们与底层数据库的交互就有两种选择了(这句话说得不是很准确,微软.net 框架下还是有其他的ORM框架的,,如Nhibernate):ado.net EF、ado.net 。

你可能以为我上面的内容写错了,ado.net EF 、ado.net 两者怎么都带有一个ado.net呢?

OK,如果你有这样的疑问的话,那么我们就有必要来了解一下.net的一些基本知识了

(1).net: 最核心的基础平台(可以看做运行环境和巨多类库),仅次于操作系统

(2)asp.net: .net平台下进行网站开发的框架

(3)asp.net MVC:asp.net 框架下开发网页的一种框架

(4)ado.net: .net平台下访问数据库的框架,他提供了一些列的访问数据库的类库

(5)ado.net EF: ado.net框架下访问数据库的最新最强大的ORM

(6)ORM: 把数据库映射为实体类的技术

(7)NHibemate: .net平台内访问数据库的一种可选ORM,从Java转换而来

以上仅仅是个人见解,不代表官方说法。

上面只是对ado.net 和ado.net EF两者进行了简单了解,下面我们再对两者进行一个具体的比较学习

(1)ado.net 做为原装的直接跟数据库打交道,直接操作数据库,没有进行额外的封装。比如我们可以直接执行sql语句,直接调用存储过程。直接操作DataSet数据集等等数据。

(2)EF 是ORM思想的付诸于实践,它对ado.net进行了封装,对数据表进行了映射处理,以对象的形式展现在开发人员面前。开发人员可以利用Linq语句的优势来执行增、改、查。但是最终的操作都是要转换成SQL语句来执行。比如:

From a in Context.Student
Where a.id =1
Select a;
真正执行的时候会转换成 SQL " Select * from Student Where id=1"。

EF让我们可以用面向对象的思想来编写程序,把注意力集中在系统中的业务环节。但是由于他要进行一次SQL语句的转换,所以相对于原始的ADO.NET来说,EF由于进行了封装,所以性能相对ADO.NET来说差一点点。不过EF也在不断的优化和改进中。 当然,EF也可以直接执行SQL语句和存储过程。有人会问,那为什么不直接执行SQL语句呢,回答是,直接执行的话要EF有什么用呢,EF就是在推行以面向对象编程的思想来处理业务。

OK,上面对两者进行了简单的比较,既然微软对ado.net 进行封装推出EF,那说明EF相对于原始的ado.net还是有优势的呢,那具体有哪些呢?

EF相对于ado.net 的优点

(1)开发效率高,开发人员完全可以根据面向对象的思维进行软件的开发

(2)可以使用三种设计模式中的ModelFirst来设计数据库,而且比较直观

(3)可以跨数据库,只需要在配置文件中修改连接字符串

(4)与vs结合的比较好

缺点:性能上赶不上原生的ado.net (因为他中间还有一个生成sql脚本的过程)

上面的缺点也暴露了一个问题:ado.net EF替代ado.net 。

那有没有折中一点的方案,两者都使用呢?

答案是肯定的,我们可以在EF中使用sql语句和存储过程。那具体如何使用?

不要急,下面我们就一起来学习。

在 EF第一个版本(.NET 3.5 SP1)中,我们只能通过将ObjectContext.Connection转换为EntityConnection,再把 EntityConnection.StoreConnection转换为SqlConnection。有了这个SqlConnection,我们再创建 SqlCommand便能顺利运行SQL命令了。(个人觉得其实很烦,呵呵)

例如:

EntityConnection entityConnection = (EntityConnection)ctx.Connection;
DbConnection storeConnection = entityConnection.StoreConnection;
DbCommand cmd = storeConnection.CreateCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "[PRO_USER_DIGITALCARD_CHECK]";
//。。。。。。。


在EF4(.NET 4)中,我们有了全新的API:ObjectContext.ExecuteStoreCommand(...)和 ObjectContext.ExecuteStoreQuery<T>(...)。从函数名不难知道前者是为了执行某一并无返回集的SQL 命令,例如UPDATE,DELETE操作;后者是执行某一个查询,并可以将返回集转换为某一对象。
using (FlowersPlatformEntities db = new FlowersPlatformEntities())
{
string selectSql = "select * from Flower";
ObjectResult<Flower> result = db.ExecuteStoreQuery<Flower>(selectSql, null);
foreach (var item in result)
{
//遍历查询结果
}
string insertSql = "insert into dbo.Flower values('月季','月季很好看。。。。。。')";
int res = db.ExecuteStoreCommand(insertSql, null);
if (res > 0)
{
//插入成功
}
else
{
//插入失败
}
}
存储过程:

(1)新建存储过程

create proc MianDemo
@id int
as
select *
from dbo.Indicator
where dbo.Indicator.Id=@id
上面新建的存储过程没有什么实际意义,只是用来举例使用的。

(2)EF中执行存储过程

SqlParameter[] param = new SqlParameter[] { new SqlParameter("@id", 1) };
var temp = db.ExecuteStoreQuery<Indicator>("exec MianDemo @id",param).ToList();
foreach (var item in temp)
{
Response.Write(item.Id);
}
存储过程的执行方法与查询的方法是同一个。

</pre><pre code_snippet_id="1628892" snippet_file_name="blog_20160330_4_5375036" name="code" class="csharp">

到了EF4.1,API的名字又有了些许改变。如果说DbContext将ObjectContext做了包装,那么DbContext.Database就是对应于数据库端信息的封装。执行SQL命令也自然从Database类型开始。对应于ExecuteStoreCommand和ExecuteStoreQuery<T>的是Database.ExecuteSqlCommand和Database.SqlQuery<T>。

只要修改上面的代码的方法名称,就可以实现代码重用,在此就不在罗列了。

OK,经过上面的练习,不知你是否掌握了如何在EF中执行sql语句呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: