自从我开始使用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 = ;

//3.跟新到数据库

db.SaveChanges();

  3.2直接修改

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

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

EF4中,使用方法

lover.state = ;

                        lover.id = ;

                        //0.1添加到EF管理容器中,并获取 实体对象 的伪包装类对象

                        EF.CreateObjectSet<Love>().Attach(lover);

                        EF.ObjectStateManager.ChangeObjectState(lover, EntityState.Modified);

                        EF.SaveChanges();

                        res = "existAndUpdate";

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

EF5中的使用方法

//0.0创建修改的 实体对象

Models.BlogArticle model = new BlogArticle();

model.AId = ;

model.ATitle = "新的数据";

model.AContent = "新的数据~~~~~";

//0.1添加到EF管理容器中,并获取 实体对象 的伪包装类对象

DbEntityEntry<Models.BlogArticle> entry = db.Entry<Models.BlogArticle>(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<PersonView>("SELECT PersonID, Name FROM Person");

//案例2

string findTableSql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = '"

                                + templetName+"'";

                            //比较怕这个字段在很多表里面都有

                            loopTable = db.ExecuteStoreQuery<string>(findTableSql).FirstOrDefault();

                            string totalCountSql = "select count(0) from " + loopTable;

                            loopNumber = db.ExecuteStoreQuery<int>(totalCountSql).FirstOrDefault();

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

EF5使用案例

string sqlString = "select * from VoteDetail where PhoneNumber='" + phoneNumber + "' and VotePicId="

                        + id + " and [VoteDate]='" + nowDate + "'";

                    //比较怕这个字段在很多表里面都有

                    VoteDetail findTable = db.Database.SqlQuery<VoteDetail>(sqlString).FirstOrDefault();

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

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

using (MyObjectContext db = new MyObjectContext() )

{

    string sql = “ select columnA, columnB from TableA where  =  ”;

    db.ExecuteStoreQuery<TableAObject>(sql).ToList();//TableAObject就是你定义的对象,对象属性就是columnA, columnB

}

code  first, 你的db是继承DbContext

using (MyDbContext db = new MyDbContext() )

{

    string sql = “ select columnA, columnB from TableA where  =  ”;

    db.TableAObject.SqlQuery(sql).ToList();//TableAObject就是在MyDbContext 定义的对象

 }

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

db.Database.ExecuteSqlCommand(sqlString)

这里面说下区别:

ExecuteSqlCommand与SqlQuery

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

五、延伸阅读

http://www.16aspx.com/Article/3525

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

http://www.cnblogs.com/JustRun1983/p/3261074.html

Entity Framework返回IEnumerable还是IQueryable?

EF各版本增删查改及执行Sql语句的更多相关文章

  1. EF增删查改加执行存储过程和sql语句,多种方法汇总

    ActionUrl c = new ActionUrl() { ActionName="test", RequestUrl="/123/123", SubTim ...

  2. EF简单的增删查改

    Add /// <summary> /// /// </summary> public void Add() { TestDBEntities2 testdb = new Te ...

  3. EF 集合版 增删查改

  4. 009.增删查改语法(sql实例)

    --------------------------------------------合并结果集SELECT UNION -------------------------------------- ...

  5. Asp.Net MVC EF之一:使用Database类在EF框架中执行Sql语句

    引言 从EF6开始,增加了DateBase类,他通过从 DbContext 对象获取此类的实例.可用于管理支持数据库上下文或连接的实际数据库.这包括创建.删除和检查数据库的存在. 在6以前,我们使用E ...

  6. 3.EF 6.0 Code-First实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...

  7. JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql

    JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...

  8. 4.在MVC中使用仓储模式进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...

  9. 使用EntityFramework6完成增删查改和事务

    使用EntityFramework6完成增删查改和事务 上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详细讲解一下. 使用EF对数据库进行操作, ...

随机推荐

  1. 流量分析系统----讲解-echarts模拟迁移(结合china.js)

    百度 Echarts 地图->模拟迁徙,实现自动切换地图 小航哥注释: 1.本文主要是把模拟迁移的流程讲了一遍,讲的很好.具体实现参考航哥这篇随笔“流量分析系统----实现-echarts模拟迁 ...

  2. PHP......会话控制SESSION与COOKIE

    一.SESSION Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 ...

  3. PAT 天梯赛 L1-043. 阅览室 【STL】

    题目链接 https://www.patest.cn/contests/gplt/L1-043 思路 将每一次 借出和归还 都用 MAP 标记 如果归还的时候 已经被标记过了 那么 ANS ++ 并且 ...

  4. ASP.NET 4.0 ListView等容器控件中获取ClientID值与HTML中自动生成ID字符串不一样问题。

    ASP.NET 4.0 中 ClientIDMode的属性 可以设置获取不同ID格式的值. 项目中遇到的问题: 1.ListView1 ItemDataBound事件中,获取ClientID结果与自动 ...

  5. 优化MD5和IP在(MySQL)数据库中的存储

    1.MD5在MySQL数据库中的存储 用CHAR(32)来存储MD5值是一个常见的技巧.如果你的应用程序使用VARCHAR(32),则对每个值得字符串长度都需要花费额外的不 必要的开销.这个十六进制的 ...

  6. 转载:ensemble计划和数据库

    原文来源:x2yline在生信进化树上的评论,http://www.biotrainee.com/thread-626-1-1.html Ensemble( ensembl.org网站是常用真核生物参 ...

  7. PHP的异常处理、错误的抛出及错误回调函数

    一.错误.异常和等级常量表 error:不能再编译期发现运行期的错误,不如试图echo输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断. exception:程序执行过程中出现意 ...

  8. GIT截图

    GIT截图 今天首次成功用了GIT上传了JAVA代码,感觉一下次就能上传这么多代码,确实比在网页上方便.自己一开始根本摸不着头脑,不知道怎样使用GIT软件,但在学姐博客的指导下,在同学热情且耐心地指导 ...

  9. debian下使用dynamic printk分析usb转串口驱动执行流程

    看了一篇文章<debug by printing>,文中提到了多种通过printk来调试驱动的方法,其中最有用的就是"Dynamic debugging". “Dyna ...

  10. PHP 面向对象及Mediawiki 框架分析(一)

    此文是一JAVA哥大神写的,虽然他不懂PHP.我这人PHP半桶水,面向对象更是半桶水都没有,此文原本是为了让我理解MediaWiki的运行机制的,愣是用他的JAVA的面向对象知识,对Mediawiki ...