none
EF的缓存机制 RRS feed

  • 问题

  • 不是说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(网站目前不对外开放)。谢谢。


    2015年3月14日 9:45

答案

  • Hello,

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

    这种查询方式总是会发送一个查询到数据库,但是这个query是可以cached.

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

    如果你想查询EF 缓存的记录,你可以用DbSet.Local:

    Using Local to look at local data

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

    这个是by designedfeature。我建议你可以用lazy-loading.

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年3月16日 7:56
    版主

全部回复

  • Hello,

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

    这种查询方式总是会发送一个查询到数据库,但是这个query是可以cached.

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

    如果你想查询EF 缓存的记录,你可以用DbSet.Local:

    Using Local to look at local data

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

    这个是by designedfeature。我建议你可以用lazy-loading.

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年3月16日 7:56
    版主
  • Hello,

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

    这种查询方式总是会发送一个查询到数据库,但是这个query是可以cached.

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

    如果你想查询EF 缓存的记录,你可以用DbSet.Local:

    Using Local to look at local data

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

    这个是by designedfeature。我建议你可以用lazy-loading.

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    谢谢。

    query的Cache实现正在研究。

    DbSet.Local倒真的不知道,只是听说可以二级缓存(比如使用第三方的Provider),我研究下。

    "by designed"这个feature?还真的不懂。我的EF是通过designer设计后,自己编写T4模板生成的codefirst模式,应该跟“by designed”没有关系吧?

    出现每次访问Navigation属性都会去查询一次数据库,无论是否使用了Include,经检测跟踪并搜索资料后发现,就是因为用的LazyLoading模式,关闭LazyLoading后,Include起作用了。

    参见:https://msdn.microsoft.com/en-us/data/jj574232?f=255&MSPPError=-2147217396

    非常感谢你的回复。

    2015年3月17日 2:29