EF5+MVC4系列(5) 删除的方法 1:系统推荐的先查询后remove删除的方法 2:自己new一个包含主键的类,然后 attach附加 remove删除;3:使用db.Entry 修改状态删除4:EntityState的几种状态
我们还是以订单表为例
1:系统推荐的方法,先查询出来,然后调用remove方法进行删除
我们删除id大于等于4的
static void Main(string[] args)
{
Delete(o => o.Id >= 4); //这里的参数是个 lambda 表达式
}
public static void Delete(Expression<Func<Order, bool>> whereLambda)
{
//先查询
List<Order> orders = db.Order.Where(whereLambda).ToList(); foreach (Order item in orders)
{
db.Order.Remove(item); //把已经带有代理类状态的实体,调用remove方法,使他的状态为 deleted 状态
}
db.SaveChanges(); }
2: 优化版本, 我们自己new一个包含主键的对象,然后调用 attach先附加到上下文中,然后再使用remove方法来删除
我们删除掉id为2的行
public static void Delete2()
{
Order order = new Order() { Id = 2 }; //默认是 EntityState.Detached 未附加状态 db.Order.Attach(order); //状态从 EntityState.DetachedDetached 变成 EntityState.Unchanged 未修改状态
db.Order.Remove(order); //状态从 EntityState.Unchanged 变成 EntityState.Deleted 删除状态
try
{
db.SaveChanges();
}
catch (Exception)
{ }
}
3:优化版本 调用 db.Entry方法,然后修改状态为 Deleted (实际上 优化2也是使用的优化3一样的实质,就是更改了 EntityState 的状态为 Deleted )
这次我们删除数据库id为3的数据
public static void Delete3()
{
Order order = new Order() { Id = 3 }; //默认是 EntityState.Detached 未附加状态 //db.Order.Attach(order); //状态从 EntityState.DetachedDetached 变成 EntityState.Unchanged 未修改状态
//db.Order.Remove(order); //状态从 EntityState.Unchanged 变成 EntityState.Deleted 删除状态 DbEntityEntry<Order> entry = db.Entry(order);
entry.State = EntityState.Deleted; try
{
db.SaveChanges();
}
catch (Exception)
{ }
}
我们用 Sql Server Profiler监控可以看到 id为3的数据已经被删除了
小结: EntityState的几种状态
- Detached:对象存在,但未由对象服务跟踪。在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态;
- Unchanged:自对象加载到上下文中后,或自上次调用 SaveChanges() 方法后,此对象尚未经过修改;
- Added:对象已添加到对象上下文,但尚未调用 SaveChanges() 方法;
- Deleted:使用 DeleteObject(System.Object) 方法从对象上下文中删除了对象;
- Modified:对象已更改,但尚未调用 SaveChanges() 方法。
原理:在EF中有一个叫做对象管理容器(ObjectStateManager)的东东,如果你希望对某些对象进行增加、删除、修改,查询的操作,那么你首先需要把这些实体对象添加到这个对象管理容器中,(查询出来的实体默认已经添加进去,不用手动添加了)。但是假如你把好几个对象都添加到了EF的对象管理容器中(ObjectStateManage)那么提交的时候,系统(EF)怎么知道你是增加、删除还是修改呢?这时就需要另外一个东东出场了,它叫做DbEntityEntry(一个伪包装类)。这个伪包装类会自动把你放到对象管理容器中的对象包裹起来,这时你放进去的实体默认都放到一个自动产生的伪包装类中,这个类还有一个很重要的属性就是对象的状态,是一个枚举类型的值。有Add、Deleted、Detached、Modified、Unchanged这样几个值,这几个值得意思就不用我讲解了吧,相信大家一看都懂。这是db.savechanges()的时候EF就会根据实体和实体状体生成相应的sql语句,对数据库进行增删改查操作
EF5+MVC4系列(5) 删除的方法 1:系统推荐的先查询后remove删除的方法 2:自己new一个包含主键的类,然后 attach附加 remove删除;3:使用db.Entry 修改状态删除4:EntityState的几种状态的更多相关文章
- EF5+MVC4系列(12) 在主视图中直接用RenderAction调用子Action,并返回视图(Return View)或者分部视图(Return PartialView); 从主Action传值到子Action使用TempData传值;TempData高级用法
结论: ViewData 适用于 在一次请求中 传递数据 . 比如我们从 主Action 到 主视图, 然后在 主视图中 用 RenderAction 请求子Action的时候,就是算作 一次请求 ...
- EF5+MVC4系列(11)在主视图中用Html.RenderPartial调用分部视图(ViewDate传值);在主视图中按钮用ajax调用子action并在子action中使用return PartialView返回分布视图(return view ,return PartialView区别)
一:主视图中使用Html.RenderPartial来调用子视图(注意,这里是直接调用子视图,而没有去调用子Action ) 在没有使用母版页的主视图中(也就是设置了layout为null的视图中), ...
- 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句
如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true) ...
- EF5+MVC4系列(6) 简单三层的搭配(泛型) 实现 增删改查
1:项目结构 2:每层添加对其他层的引用,这里我们把除了Web层之外的所有的层生成的文件都放到解决方案下的Library文件夹下,然后每个项目分别来引用里面的dll项目文件. 我们在Model项目上, ...
- EF5+MVC4系列(1) Podwerdesigner15.1设计数据库;PD中间表和EF实体模型设计器生成中间表的区别;EF5.0 表关系插入数据(一对多,多对多)
在上一篇文章中, http://www.cnblogs.com/joeylee/p/3790980.html 我们用 PD15.1 来设计了数据库,并且生成 了sql数据库,现在我们用 vs2013 ...
- EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))
一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Ord ...
- EF5+MVC4系列(2) EF5报错 无法确定“XXX”关系的主体端。添加的多个实体可能主键相同
情景:用户表和订单表是一对多的关系,即 一个 Userinfo 对应对应有 多个 Order表 如果我在EF中,先创建一个用户,然后创建3个订单,然后关联这1个用户和3个订单的关系,毫无问题. ...
- 关于EF框架EntityState的几种状态
在使用EF框架时,我们通常都是通过调用SaveChanges方法把增加/修改/删除的数据提交到数据库,但是上下文是如何知道实体对象是增加.修改还是删除呢?答案是通过EntityState的枚举值来判断 ...
- EF5+MVC4系列(8) ActionResult的返回值
我们在MVC的代码中,经常会看到这样的一个 代码 可能有人会有疑问,既然我定义的是ActionResult,为什么返回值会是View方法呢? 其实这个View方法的返回值的类型是ActionResul ...
随机推荐
- 【Socket】linux黑客之网络嗅探底层原理
1.mystery引入 1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的 2)原始套接字是一种套接字底层技术,它工作在网络层 3)谈到网络安全,刚好本学期学过这门课程,这里myst ...
- Asp.Net MVC App_Code无法识别
Asp.Net MVC需要写公共类的时候 右击添加 App_Code 文件夹,新建类—>右击类—>属性,生成操作 —>选择 —>编译 Asp.Net MVC项目本身是个应用程序 ...
- zoj 月赛B题(快速判断一个大数是否为素数)
给出一个64位的大数,如何快速判断其是否为素数 #include<algorithm> #include<cstdio> #include<cstring> #in ...
- Delphi中的三目运算函数有哪些?(XE10.2+WIN764)
相关资料:https://www.cnblogs.com/rogge7/p/6078903.html 问题现象:在做一个判断时突然想到了C++的三目运算,就在想Delphi中一共有几个? 问题处理: ...
- 基于html5背景图片自适应代码
基于html5背景图片自适应代码是一款背景不随滚动条滚动,会根据分辨率不同自动匹配对应的背景图片.效果图如下: 在线预览 源码下载 实现的代码. css代码: .jawbone-hero .jaw ...
- git 修改上次提交信息 与 撤销此操作.
git commit --amend 修改刚才提交的commit信息 撤销 git commit --amend 思路是使用 git reflog 查看在哪里ammend的.找到HEAD{N}, N是 ...
- 【WPF】树形结构TreeView的用法(MVVM)
TreeView控件的用法还是有蛮多坑点的,最好记录一下. 参考项目: https://www.codeproject.com/Articles/26288/Simplifying-the-WPF-T ...
- JMeter (2) —— JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial)
JMeter (2) -- JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial) 主要内容 JMeter与WebDriver测试用户登陆以CAS SSO为例 环 ...
- Java编程的逻辑 (33) - Joda-Time
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- python多线程生产消费
#!/usr/bin/env python# -*- coding: utf-8 -*- from threading import Threadfrom Queue import Queueimpo ...