不是说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(网站目前不对外开放)。谢谢。
你的问题是说一个Single Entity with Include,需要使用缓存?
那我们可以当EF不存在缓存,自己来啊。
Hashtable(string, object)
string=EntityType+EntityID,这样差不多就可以保证基本够用吧。
都这样,还用EF搞毛?
1、如果不是通过find而是通过query,即便有数据缓存,EF也执行查询操作。
2、对于通过Include处理的关联对象,在用到的时候,还是执行了再次查询。
@519740105: 我的意思是这样的。
我们打算登上珠峰(目标),体力不支,或者有岩石挡路,这时候我会直接叫个直升机上去的。
如果是把登上当做一个过程(研究技术,锻炼身体),那是另外一回事。
这是产品经理思维。