EF6学习笔记八:实体状态以及实现IEnumerable<>和实现IQueryable<>接口数据集查询方法的支持差异

 要专业系统地学习EF前往《你必须掌握的Entity Framework 6.x与Core 2.0》这本书的作者(汪鹏,Jeffcky)的博客:upload/201901161612125626.gif" alt="" style="margin: 0px; padding: 0px 5px 0px 0px; border: 0px; vertical-align: middle; max-width: 900px; height: auto;" /> View Code

 

1.Added状态针对添加操作,当标记为此状态时,表明实体被上下文所追踪但是不存在与数据库中

      什么意思?就是在调用SaveChanges时,如果发现有实体是这个状态,就会将该实体添加到数据库中

2.Unchanged  实体被上下文追踪,但是存在于数据库中的值未发生改变

      这说的是,你从数据库中查出的数据就是Unchanged状态,可不是值没有改变嘛?可不就是被跟踪了吗?

3.Modified   实体被上下文跟踪并存在于数据库中,同时部分或者所有属性值已经被更改

      这个还是好理解的,不过要注意,这些状态都说了,要被上下文追踪。

4.Deleted   实体被上下文跟踪并存在于数据库中,当标记为Deleted状态时,SaveChanges时数据将在数据库中被删除

5.Detached  这个就是表示没有被上下文追踪,只有通过上下文得到的实体对象才会有被跟踪,才会有其他状态,否则就是Detached

我们来把各种被操作的实体的状态打印出来看看,查看实体状态,用Entry()方法

我们现在凭空new 一个对象

 View Code

 

当我们调用Add方法,实体状态变为Added

 View Code

 

然后将这个实体添加到数据库,然后查询出来,这个查询出来的实体状态为Unchanged

 View Code

 

让我想不到的是,我不用查询,直接查看他的状态就是Unchanged,有点神奇

我们查询出一个实体,然后修改某个属性值,状态变为Modified

 View Code

 

我们调用Remove方法,实体状态变为Deleted。我刚刚还为Unchanged状态感到神奇呢,现在看来我居然只有通过这种方式来获得Deleted状态

 View Code

 

上下文没有提供Update方法,所以我们要通过更改实体状态的方式来更新数据

 View Code

 

关于实体状态就先浅尝辄止了

实现IEnumerable<>接口和IQueryable<>接口数据集支持查询方法的差异

我在学LINQ(语言集成查询)时对这两个接口稍微有点了解,之后看别人的博客,详解IQueryable<>接口,我看不太明白,很气馁

LINQ是什么,他是想对查询语法做一个统一,我们在数据库中查询数据要写SQL语句,查询XML用DOM操作,那能不能来个统一的方式,不要让我去学习那么多的查询语句了,那么LINQ就来了

写LINQ有两种方法,一个是写查询语句,像什么from a in list  select a;这样的,还一个就是调用方法,像Where()、Select()……

这两种方式没什么区别,只不过一些聚合查询必须得调用方法才行,大部分的查询语句和方法都能来

还有一点,LINQ里面有延迟加载,聚合查询会立即执行,官网上面写了有,什么方法会立即执行查询

LINQ的那些查询方法都是扩展在IEnumberable类上的,所以我们也可以通过扩展这个类来扩展LINQ

我来说一下IEnumberable<>和IQueryable<>这两个接口,查询内存中的数据都是实现的IEnumberable接口,查询远程数据是实现的IQueryable<>接口

 View Code

 

他们之间很多方法都匹配,但是有一些方法不行,上面的两个Where方法不是一样的,一个返回的是IEnumberable,一个返回的IQueryable

Last 和LastOrDefault

这两个方法在IQueryable中不支持,我也就搞不明白了,算了,反正这两方法我真是一次都没用过

当我对上下文的数据集调用LastOrDefault方法时,报错,NotSupportedException  不支持异常

System.NotSupportedException: LINQ to Entities does not recognize the method '_2019011402.Entity.Book LastOrDefault[Book](System.Linq.IQueryable`1[_2019011402.Entity.Book])' method, and this method cannot be translated into a store expression.

Contains方法

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信