应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

对EF状态System.Data.EntityState的一点理解

7614人阅读 2019/10/12 10:12 总访问:5185808 评论:7 收藏:1 手机
分类: EF

System.Data.EntityState一共有五种状态

 分别是Added,Deleted,Modified,UnChanged,Detached下面给一个简单的解释

  • System.Data.EntityState.Added

在上下文中,而且对象是需要添加的状态

  • System.Data.EntityState.Deleted

在上下文中,而且对象是需要删除的状态

  • System.Data.EntityState.Modified

在上下文中,而且对象是需要修改的状态

  • System.Data.EntityState.UnChanged

在上下文中,对象没有任何状态

  • System.Data.EntityState.Detached

没有在上下文中,ef上下文没有关联的状态


当调用SaveChanges的时候ef会根据这些状态响应到数据库去

使用ef查询出来的对象属于EntityState.UnChanged状态

Unchanged状态说明ef在上下文中,处于这种状态我们就可以很方便的对他进行删除,修改了

调用Add方法后对象属于EntityState.Added状态

 

 添加成功后,对象就处于Unchanged了

  

 有个有趣的想法我们先调用Add后在手动把状态修改成Unchanged看看能不能添加成功,我们的想法是不得行!因为是根据状态来操作数据库的

 

 哈哈果然如此!

调用Attach方法后对象属于EntityState.Unchanged状态

所以如果我们是一个新的对象进行cud操作通常情况下先把对象加入上下文后在进行操作

还可以直接使用oae.Entry(item).State = EntityState.Unchanged;这种方式修改状态

New的新对象属于EntityState.Detached状态

也就是对象没有在上下文中

例如我们随便弄一个对象然后获取他的状态看看,就是Detached状态

如果在这种状态下直接去进行,Remove,改变字段修改状态等

  1. //删除
  2. oae.Users.Remove(item);
  3. //改变字段状态
  4. oae.Entry(item).Property("UserName").IsModified = true;

就会报错:对象不在上下文中

改变字段状态报错:

删除之所以会报错其实可以看Remove方法的注释:在调用此方法之前,该实体必须以另一种状态存在于该上下文中

虽然Remove方法是吧状态修改为Deleted但是有个前提是对象必须以另外一种状态存在上下文中

因为我们对象是相当于是直接new的一个所以肯定不在上下文中,我们可以使用调用Attach方法之后在删除

可以看到Attach方法就是把对象以Unchanged状态附加到上下文,

当然我们还可以使用oae.Entry(item).State = EntityState.Unchanged;方式把对象以Unchanged状态附加到上下文,道理都一样

看看remove后的状态以及修改成Deleted了

所以我们在使用ef做curd操作的时候要注意对象的状态


没有时间了,赶紧写教材




欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

剑轩

2019/10/12 14:04:29

[挖鼻][挖鼻]没人评价,自己来一个

小毅

2019/10/12 17:46:53

腻害!

剑轩:@小毅哈哈,握手握手,最近怎么样哇

2019/10/13 20:41:38 回复

是伍尚金哇_v

2019/10/18 17:53:28

写啥教材

2019/10/19 9:11:50 回复

青春年华

2019/11/19 17:10:17

[嘻嘻]

剑轩:@青春年华O(∩_∩)O哈哈~

2019/11/19 17:21:32 回复

css图片和文字齐问题

文字和图片写到一排经常会出现对不齐的问题 这样感觉图片会上来一点没有和文字对齐,如下图 但是如果修改下html结...

css实现简单矩形话框

在前端做项目时,我们可能会遇到写对话框的需求,这次做视频会议页面就遇到了,记录下日后有个参照。//网页部分 <divcla...

vs2017 COM 组件的调用返回了错误 HRESULT E_FAIL

vs2017添加引用报错 对 COM 组件的调用返回了错误 HRESULT E_FAIL 1.以管理员身份打开vs2017开发人员命令指示符 2...

C ?、?? 问号和2个问号的用法(类型?、象?)

C# ?C# ???:单问号1.定义数据类型可为空。可用于对int,double,bool等无法直接赋值为null的数据类型进行null的赋值如这...

JSON象和JSON字符串的区别

JSON对象是直接可以使用JQuery操作的格式,如C#中可以用对象(类名)点出属性(方法)一样var str2 = { "name": ...

象转JSON

/// <summary> /// 对象转json /// </summary> public static string ToJson(object jsonObject) ...

CSS相定位与绝定位

一般相对定位和绝对定位可以配合起来使用 例如实现如下的效果 只需要在外层div设置为相对定位,在内部设置为绝对定位就...

js遍历localStorage的键值

//遍历本地存储localStorage for(vari=0;i<localStorage.length;i++){ varkey=localStorage.key(i);//获取本地存储的K...

拓展js通用方法来应c操作

有很多时候,js不能像c#一样有那样多的方法操作,但是我们可以自己写一些方法,让他拥有:比如最常见的一些:注意:js里的...

类型“DbSet”在未引用的程序集中定义。必须添加程序集“EntityFramework Version=5.0.0.0 Culture=neutral PublicKeyToken=b7

在用mvc+ef的时候在DAL层引用上下文信息的时候会报出下面错误其实就是没得EntityFromwork,打开vs项目,点击工具,选择NuGe...

怎样解决安卓在微信浏览器于第三方网页的两次请求问题?

之前的项目是没有这种情况的,但是最近发现安卓手机在微信浏览器访问第三方网页时,页面点击某个按钮,写日志显示只触发了...

下划线、换行、回车、空格ASCII码值与照表

下划线,ASCII码95换行 , ASCII码10回车 , ASCII码13空格 , ASCII码32ASCII码表:Bin(二进制)Oct(八进制)Dec(十进制)Hex(...

谈谈事件和委托的理解

对于c#的程序员来说,事件和委托可能是一道坎,过去的人觉得很简单,没过去的人觉得这个堵得慌 ,每次用着都很难受。本人就...

数据读取器与指定的"xx"不兼容。某个类型为"xx"的成员在同名的数据读取器中没有应的列

报错的地方var result= _db.Database.SqlQuery<SMachine>(sql).FirstOrDefault();经过分析,是因为SqlQuery方法查询...

C ServiceStack.Redis操作Redis_基本键值

Redis的基本数据类型:基本的键值对List集合Set集合有序Set集合Hash表ServiceStack.Redis操作基本键值对:staticvoidMain(s...

Net Core使用依赖注入来装载EF的上下文

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...