博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF各版本增删查改及执行Sql语句
阅读量:6535 次
发布时间:2019-06-24

本文共 4474 字,大约阅读时间需要 14 分钟。

  自从我开始使用Visual Studio 也已经经历了好几个版本了,而且这中间EF等框架的改变也算是比较多的。本篇文章记录下各个版本EF执行Sql语句和直接进行增删查改操作的区别,方便自己随时切换版本。目前我们公司同时在使用VS2010 对应EF4和VS2015 对应EF5和EF6,因为有些老的项目必须得定期更新维护。

一、新增

UserList u = new UserList();           u.name=name;           u.age = age;           u.jointime = date;//添加,这个只是在内存上操作            db.UserList.AddObject(u);            //保存到数据库            db.SaveChanges();

而在EF5中使用Add

db.UserList.Add(u );

二、删除

 

          //需要一个实体对象参数                //1,创建要删除的对象                //UserList modelDel = new UserList() { ID = id };                UserList list = db.UserList.FirstOrDefault(c => c.ID == id);                //2,将对象添加到EF管理容器中(没有这步也可以删除)                //db.UserList.Attach(list);                //3,修改对象的包装类对象标识为删除状态                db.UserList.DeleteObject(list);                //4,更新到数据库                db.SaveChanges();

而在ef5中使用Remove

EF.TourList.Remove(model);

三、修改   update  

  EF中会为每个管理的实体对象创建一个代理包装类对象,其中会跟踪 实体对象 的状态和每个属性的状态;

  3.1 先查询再修改

  通常使用EF更新的方式,先查询出要修改的数据,然后再修改新的值;实体对象被修改的属性 在 代理包装类对象里 的对应属性状态会被修改记录下修改状态,等到调用SaveChanges时,EF会遍历其管理的每个实体对象,并根据其 包装类对象 的状态,生成增删改查sql语句并执行;

      此例中修改操作,会生成 修改的sql语句(注意:此处只为修改过的属性生成sql语句),最后执行。

      缺点:修改先还要查询,难受

//1.先查询要修改的原数据Models.BlogArticle modelNew = db.BlogArticles.Where(a => a.AId == model.AId).FirstOrDefault();//2.设置修改后的值modelNew.ATitle = "新的数据";modelNew.AContent = "新的数据~~~~~~";modelNew.ACate = 12;//3.跟新到数据库db.SaveChanges();

  3.2直接修改

  为避免先查询数据库,可以直接将 被修改的实体对象 添加到 EF中管理(此时为附加状态Attached),并手动设置其为未修改状态(Unchanged),同时设置被修改的实体对象的包装类对象 对应属性为修改状态。

  优点:修改前不需要查询数据库。

EF4中,使用方法

lover.state = 0;                        lover.id = 4;                        //0.1添加到EF管理容器中,并获取 实体对象 的伪包装类对象                        EF.CreateObjectSet
().Attach(lover); EF.ObjectStateManager.ChangeObjectState(lover, EntityState.Modified); EF.SaveChanges(); res = "existAndUpdate";

这种方法,如果之前查询了这个id的实例对象,那么要释放,使用自己写dispose方法。

EF5中的使用方法

//0.0创建修改的 实体对象Models.BlogArticle model = new BlogArticle();model.AId = 12;model.ATitle = "新的数据";model.AContent = "新的数据~~~~~";//0.1添加到EF管理容器中,并获取 实体对象 的伪包装类对象DbEntityEntry
entry = db.Entry
(model);//**如果使用 Entry 附加 实体对象到数据容器中,则需要手动 设置 实体包装类的对象 的 状态为 Unchanged**//**如果使用 Attach 就不需要这句entry.State = System.Data.EntityState.Unchanged;//0.2标识 实体对象 某些属性 已经被修改了entry.Property("ATitle").IsModified = true;entry.Property("AContent").IsModified = true;//3.跟新到数据库db.SaveChanges();

四、执行Sql命令

EF4中使用案例

//案例1 var peopleViews = db.ExecuteStoreQuery
("SELECT PersonID, Name FROM Person");//案例2string findTableSql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = '" + templetName+"'"; //比较怕这个字段在很多表里面都有 loopTable = db.ExecuteStoreQuery
(findTableSql).FirstOrDefault(); string totalCountSql = "select count(0) from " + loopTable; loopNumber = db.ExecuteStoreQuery
(totalCountSql).FirstOrDefault();
View Code

根据返回值的类型,设置接收容器类型,也可以直接使用VAR

EF5使用案例

string sqlString = "select * from VoteDetail where PhoneNumber='" + phoneNumber + "' and VotePicId="                        + id + " and [VoteDate]='" + nowDate + "'";                    //比较怕这个字段在很多表里面都有                    VoteDetail findTable = db.Database.SqlQuery
(sqlString).FirstOrDefault();
View Code

这是比较常用的方法,实际上,是有两种执行方式的。

EF model first方式, 你的DB是继承ObjectContext

using (MyObjectContext db = new MyObjectContext() ){    string sql = “ select columnA, columnB from TableA where 1 = 1 ”;    db.ExecuteStoreQuery
(sql).ToList();//TableAObject就是你定义的对象,对象属性就是columnA, columnB}
View Code

 code  first, 你的db是继承DbContext

using (MyDbContext db = new MyDbContext() ){    string sql = “ select columnA, columnB from TableA where 1 = 1 ”;    db.TableAObject.SqlQuery(sql).ToList();//TableAObject就是在MyDbContext 定义的对象 }
View Code

这里只是列举查询的方式,仅供参考,一般新增 删除 或者修改 用对象的方式比较多,如果是sql,一般是

db.Database.ExecuteSqlCommand(sqlString)

 

这里面说下区别:

 

ExecuteSqlCommand与SqlQuery

 

  在数据上下文DBModel的实例中有个Database属性,其中有两组方法.ExecuteSqlCommand()和.SqlQuery()。它们都可以执行SQL语句,只不过.ExecuteSqlCommand()是不返回结果的,只返回受影响的行数,所以.ExecuteSqlCommand()更适合执行创建、更新、删除操作。.SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以更适合执行查询操作

 

 

五、延伸阅读

分享基于Entity Framework的Repository模式设计源码

 

Entity Framework返回IEnumerable还是IQueryable?

 

 

 

 

 

转载于:https://www.cnblogs.com/qixinbo/p/7295842.html

你可能感兴趣的文章
编译tomcat
查看>>
oracle-xe手工创建数据库
查看>>
我的友情链接
查看>>
UG中卸载被占用的DLL
查看>>
eclipse 设置注释模板详解,与导入模板方法介绍总结
查看>>
Cocos2d-x3.2 文字显示
查看>>
估计下星期就能考科目二了
查看>>
轻松实现localStorage本地存储和本地数组存储
查看>>
mongodb group
查看>>
python+selenium自动化测试(二)
查看>>
(笔记 - 纯手敲)Spring的IOC和AOP 含GIT地址
查看>>
session_start()放置位置的不正确引发的ROOT常量 未定义的错误
查看>>
如何设定VDP同时备份的任务数?
查看>>
ipsec的***在企业网中的经典应用
查看>>
过来人谈《去360还是留在百度?》
查看>>
mysql备份工具innobackupex,xtrabackup-2.1安装,参数详解
查看>>
【复制】slave筛选复制之二(create/drop table语句)
查看>>
Movie Store OpenCart 自适应主题模板 ABC-0249
查看>>
RedHat linux YUM本地制作源
查看>>
apache端口占用问题
查看>>