这样一来,.net平台下,我们与底层数据库的交互就有两种选择了(这句话说得不是很准确,微软.net 框架下还是有其他的ORM框架的,,如Nhibernate):ado.net EF、ado.net 。
你可能以为我上面的内容写错了,ado.net EF 、ado.net 两者怎么都带有一个ado.net呢?
OK,如果你有这样的疑问的话,那么我们就有必要来了解一下.net的一些基本知识了
(1).net: 最核心的基础平台(可以看做运行环境和巨多类库),仅次于操作系统以上仅仅是个人见解,不代表官方说法。
上面只是对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 的优点缺点:性能上赶不上原生的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]";
//。。。。。。。
using (FlowersPlatformEntities db = new FlowersPlatformEntities())
{
string selectSql = "select * from Flower";
ObjectResult result = db.ExecuteStoreQuery(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
上面新建的存储过程没有什么实际意义,只是用来举例使用的。
SqlParameter[] param = new SqlParameter[] { new SqlParameter("@id", 1) };
var temp = db.ExecuteStoreQuery("exec MianDemo @id",param).ToList();
foreach (var item in temp)
{
Response.Write(item.Id);
}
存储过程的执行方法与查询的方法是同一个。
到了EF4.1,API的名字又有了些许改变。如果说DbContext将ObjectContext做了包装,那么DbContext.Database就是对应于数据库端信息的封装。执行SQL命令也自然从Database类型开始。对应于ExecuteStoreCommand和ExecuteStoreQuery
只要修改上面的代码的方法名称,就可以实现代码重用,在此就不在罗列了。
OK,经过上面的练习,不知你是否掌握了如何在EF中执行sql语句呢?