EF各版本增删查改及执行Sql语句
自从我开始使用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语句的更多相关文章
- EF增删查改加执行存储过程和sql语句,多种方法汇总
ActionUrl c = new ActionUrl() { ActionName="test", RequestUrl="/123/123", SubTim ...
- EF简单的增删查改
Add /// <summary> /// /// </summary> public void Add() { TestDBEntities2 testdb = new Te ...
- EF 集合版 增删查改
- 009.增删查改语法(sql实例)
--------------------------------------------合并结果集SELECT UNION -------------------------------------- ...
- Asp.Net MVC EF之一:使用Database类在EF框架中执行Sql语句
引言 从EF6开始,增加了DateBase类,他通过从 DbContext 对象获取此类的实例.可用于管理支持数据库上下文或连接的实际数据库.这包括创建.删除和检查数据库的存在. 在6以前,我们使用E ...
- 3.EF 6.0 Code-First实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...
- JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql
JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...
- 4.在MVC中使用仓储模式进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...
- 使用EntityFramework6完成增删查改和事务
使用EntityFramework6完成增删查改和事务 上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详细讲解一下. 使用EF对数据库进行操作, ...
随机推荐
- list列表、tuple元组、range常用方法总结
list 列表(数组),是可迭代对象,列表是可变的所以列表的方法都是在列表本身更改的.里面看可以放各种数据类型的数据,可存储大量数据 连接列表可以使用 + 或 extend() a = [1, 3, ...
- 【转】通过fio工具,测试SATA,SAS,SSD 读写性能
转自:http://blog.csdn.net/killmice/article/details/42745937
- Python学习进程(15)常用内置函数
本节介绍Python的一些常用的内置函数. (1)cmp(x, y): cmp()函数比较 x 和 y 两个对象,并根据比较结果返回一个整数,如果 x<y,则返回-1:如果x&g ...
- java WordUtils word文档工具类
package com.sicdt.library.core.utils; import java.io.ByteArrayOutputStream; import java.io.IOExcepti ...
- 摊铺机基本参数介绍(三一重工SSP220C-5)
三一重工SSP220C-5稳定土摊铺机参数 SSP系列稳定土摊铺机SSP220C-5 动力强劲162kw 动力充分满足摊铺机各种工况下动力需求 高效任何工况,确保摊铺能力大于900t/h,行业内绝无仅 ...
- 主攻ASP.NET MVC4.0之重生:MVC Controller修改Controller.tt模版,自动添加版本注释信息
第一步找到MVC 4.0 CodeTemplates 一般路径在:C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Ite ...
- mongodb index 的background 及集群的索引建立
在数据库建立索引时,默认时"foreground" 也就是前台建立索引,但是,当你的数据库数据量很大时,在建立索引的时会读取数据文件,大量的文件读写会阻止其他的操作,此时在建立索引 ...
- pache—DBUtils框架简介、DbUtils类、QueryRunner类 、ResultSetHandler接口
Apache—DBUtils框架简介.DbUtils类.QueryRunner类 .ResultSetHandler接口 commons-dbutils 是 Apache 组织提供的一个开源 JDBC ...
- 有些 where 条件会导致索引无效
在查询中,WHERE 条件也是一个比较重要的因素,尽量少并且是合理的 where条件是徆重要的,尽量在多个条件的时候,把会提取尽量少数据量的条件放在前面,减少后一个 where 条件的查询时间.有些 ...
- Java多线程的集合类
适用于多线程环境下的集合类: 1.阻塞队列:ArrayBlockingQueue(数组实现队列),LinkedBlockingQueue(链表实现队列) public class BlockingQu ...