EF提高性能(查询禁用追踪)(关闭延迟加载)
EF默认是支持延迟加载的,在加载一个表的数据时,会把关联表的数据一并加载,这样会影响性能。
一般建议关闭延迟加载可以提高EF加载的性能。还有其他方法提高性能(查询禁用追踪)
如果要实现延迟加载,必须满足下边三个条件,缺一不可
1.context.Configuration.ProxyCreationEnabled应为true。
2.context.Configuration.LazyLoadingEnabled应为true。
3.导航属性应定义为public virtual xxx,如果属性未定义为virtual,则Context不会进行延迟加载。
namespace WindowsFormsApp2
{using System;using System.Data.Entity;using System.Data.Entity.Infrastructure;public partial class BankSystemEntities : DbContext{/*DbContext是实体类和数据库之间的桥梁,DbContext主要负责与数据交互,主要作用:1、DbContext包含所有的实体映射到数据库表的实体集(DbSet < TEntity >)。2、DbContext 将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库。3、更改跟踪: 它跟踪每个实体从数据库中查询出来后发生的修改变化。4、持久化数据: 它也基于实体状态执行插入、更新和删除操作到数据库中。 cxt.SaveChange()*/public BankSystemEntities(): base("name=BankSystemEntities"){Console.WriteLine(this.Configuration.LazyLoadingEnabled);Console.WriteLine(this.Configuration.ProxyCreationEnabled);// 延迟加载禁用了,查询一个表数据时,不会把导航属性对应其他表加载出来。this.Configuration.LazyLoadingEnabled = false;//this.Configuration.ProxyCreationEnabled = true;}protected override void OnModelCreating(DbModelBuilder modelBuilder){throw new UnintentionalCodeFirstException();}public virtual DbSet<AddressInfo> AddressInfo { get; set; }public virtual DbSet<CustomerInfo> CustomerInfo { get; set; }public virtual DbSet<StudentInfo> StudentInfo { get; set; }public virtual DbSet<UserInfo> UserInfo { get; set; }}
}
// 如果禁用延迟加载后,又想同时加载关联表,怎么办呢?使用Include()
var query10 = cxt.CustomerInfo.Include("AddressInfo").ToList(); // path参数指导航属性名称
var query11 = cxt.CustomerInfo.Include(c=>c.AddressInfo).ToList();
// 查询禁用追踪
var query12 = cxt.CustomerInfo.AsNoTracking().ToList();