自从我开始使用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. bootstrap插件实用方法

    完全通过js來配置 <p><a id="YOUR_BUTTON_FOR_POPOVER" class="btn btn-primary" ro ...

  2. MSDN使用

    比如我想查一下fopen这个函数怎么用,在索引里搜索一下fopen,很容易找到了. 但是如果我想横向扩展一下,查看一些与fopen相关的函数,应该怎么找呢? 很简单,点击定位: 你就能把fopen定位 ...

  3. imx6qsbd kpp

    转: https://blog.csdn.net/zyaiwmy/article/details/54313025 https://www.aliyun.com/jiaocheng/123973.ht ...

  4. 自定义美化UL OL发光列表

    在线演示 本地下载

  5. 自己的第一个MapReduce程序

    数据源:来自互联网招聘hadoop岗位的薪资数据,其中几行示例数据如下: 美团 3-5年经验 15-30k 北京 [够牛就来]hadoop高级工程... 北信源 3-5年经验 15-20k 北京 Ja ...

  6. Centos7.4 Nginx反向代理+负载均衡配置

    Ningx是一款高性能的HTTP和反向代理服务器,配置起来也比较简单. 测试环境: 172.16.65.190 Nginx-反向代理 172.16.65.191 Ningx-Web 172.16.65 ...

  7. vRO 添加已有磁盘到VM

    在vRO实现将已有虚拟机磁盘添加到另外的虚拟机上,以为vRA发布Oracle/SQL集群做准备: // 脚本需要两个输入 vm_obj和diskPathSystem.log("Attempt ...

  8. Bootstrap3全局CSS样式

    目录 1. 概览 2. 栅栏系统 3. 文本 4. 列表 5. 代码 6. 表格 7. 表单 7.1 基本实例 7.2 内联表单 7.3 水平排列的表单 8. 按钮 9. 图片 10. 辅助类 10. ...

  9. 音乐下载api

    青檬音乐 http://tingapi.ting.baidu.com/v1/restserver/ting?from=android&version=5.6.5.6&format=js ...

  10. IOS 发布被拒 PLA 1.2问题 整个过程介绍 03 个人账户升级公司账户

    根据上一篇文章,提交的邮件,苹果给我回了一封邮件 如下: 您好: 感谢您参与 Apple 开发者计划支持.我是 XXXX,非常荣幸协助您. 我们随时都可以开始将您的个人会员资格迁移到组织会员资格.首先 ...