EFCore使用过程中镜像查询,lazyloading,上下文资源池等记录
1.efcore使用过程中的查询,一般都会直接去库镜像中查找,要避免镜像查询数据,在查询中可以使用AsNoTracking(),让查询直 接从数据库查询避免镜像查询,例如DbContext.Product.AsNoTracking().ToListAsync().
2.efcore使用过程中,如果缓存镜像已缓存了数据,可以使用FindAsync()直接从镜像缓存中查询数据,避免直接查询数据库。例 如:_context.Products.FirstOrDefaultAsync(m => m.Id == id),可以修改为_context.Products.FindAsync(id).
3.efcore 提供两种加载方式一种是eager loading 另一种是lazy loading.要使用eager loading加载对象集合数据可以对查询添加 Include().例如:_context.Products.Include(p=>p.ProductOrders).FindAsync(Id).
而lazyloading 1.需要添加nuget包:Microsoft.EntityFrameworkCore.Proxies. 2.服务配置对于options的添加 UseLazyLoading():例如:services.AddDbContextPool<ContosoPetsContext>(options => options.UseLazyLoadingProxies().UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=ContosoPets;Integrated Security=true")); 3.对于entity类型中的集合得用virtual进行修饰例如: public virtual ICollection<ProductOrders> ProductOrders { get; set; }
4.DbContext经常创建释放问题,可以使用上下文池,例如:将 services.AddDbContext修改为使用资源池 services.AddDbContextPool。