您的位置:首页 > 数据库

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

2017-10-10 11:23 381 查看
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语句来执行。比如:

[csharp] view
plain copy

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命令了。(个人觉得其实很烦,呵呵)
例如:

[csharp] view
plain copy

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操作;后者是执行某一个查询,并可以将返回集转换为某一对象。

[csharp] view
plain copy

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)新建存储过程

[sql] view
plain copy

create proc MianDemo  

@id int  

as   

select *  

from dbo.Indicator  

where dbo.Indicator.Id=@id  

上面新建的存储过程没有什么实际意义,只是用来举例使用的。
(2)EF中执行存储过程

[csharp] view
plain copy

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

}  

存储过程的执行方法与查询的方法是同一个。

[csharp] view
plain copy

</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语句呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐