首页 新闻 会员 周边 捐助

EF的缓存机制

0
悬赏园豆:50 [已解决问题] 解决于 2015-03-30 17:18

不是说EF有缓存机制吗?

比如,在同一个请求里,如果查询了一次后,再次查询的时候,EF只使用本地已缓存的内容而不是再去数据库里查询。

 

但是,我用mimiprofiler跟踪,发现会重复查询。对此,特地做了个验证:

            var detail = _rushDetailInfoRepository.Table
                                                  .Where(x => x.Id == rushingDetailId)
                //.Include(x => x.RushInfo)
                                                  .SingleOrDefault();
            detail = _rushDetailInfoRepository.Table
                                                  .Where(x => x.Id == rushingDetailId)
                //.Include(x => x.RushInfo)
                                                  .SingleOrDefault();

以上代码,EF会执行两次SQL查询。

 

如果使用GetById(实际使用Entites的Find方法)则没这个问题。

 

以上方案是否有办法去读取缓存?

 

此外,以下代码:

            var query = _integralExchangeDetailInfoRepository.Table
                                                             .Include(x => x.ExchangeInfo)
                                                             .Include(x => x.GoodsInfo)
                                                             .Include(x => x.GoodsInfo.PictureInfoes);

当我获得IntegralExchangeDetailInfo对象后,通过导航属性获取GoodsInfo、GoodsInfo的PictureInfoes,都会再次执行SQL查询。

这个问题怎么解决性能问题?

 

可以在线确认MiniProfiller的数据,能帮忙的,需要时请联系我(QQ:68558710)开放IP(网站目前不对外开放)。谢谢。

519740105的主页 519740105 | 大侠五级 | 园豆:5810
提问于:2015-03-14 16:20
< >
分享
最佳答案
0

你的问题是说一个Single Entity with Include,需要使用缓存?

那我们可以当EF不存在缓存,自己来啊。

Hashtable(string, object)

string=EntityType+EntityID,这样差不多就可以保证基本够用吧。

收获园豆:50
爱编程的大叔 | 高人七级 |园豆:30844 | 2015-03-15 14:02

都这样,还用EF搞毛?

1、如果不是通过find而是通过query,即便有数据缓存,EF也执行查询操作。

2、对于通过Include处理的关联对象,在用到的时候,还是执行了再次查询。

519740105 | 园豆:5810 (大侠五级) | 2015-03-16 07:32

@519740105: 我的意思是这样的。

我们打算登上珠峰(目标),体力不支,或者有岩石挡路,这时候我会直接叫个直升机上去的。

如果是把登上当做一个过程(研究技术,锻炼身体),那是另外一回事。

这是产品经理思维。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-03-16 09:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册