1. 禁用延迟加载
延迟加载是常见的方式,Entity Framework在需要时可以自动为一个实体的实例获取关联的数据。
Entity Framework自动延迟加载需要同时满足以下3个条件:
(1)DbContext.Configuration.LazyLoadingEnabled = true (默认为true)
(2)DbContext.Configuration.ProxyCreationEnabled = true (默认为true)
(3)POCO类必须是public而非sealed,且集合属性使用Virtual修饰,这样Entity Framework才能Override以包含延迟加载。
延迟加载示例:
using (var ctx = new LibingContext()) { var category = ctx.Categories.Find(1); foreach (var product in category.Products) { Console.WriteLine(product.ProductName); } }
EntityFramework禁用延迟加载:
public class LibingContext : DbContext { public LibingContext() : base("Name=LibingContext") { // 禁用延迟加载 this.Configuration.LazyLoadingEnabled = false; this.Configuration.ProxyCreationEnabled = false; } }
2. AsNoTracking()与Attach()
对于只读操作,强烈建议使用AsNoTracking进行数据获取,降低数据获取所需的时间。
由于没有受到DbContext的跟踪,利于对数据及时性要求高的数据查询。
使用AsNoTracking查询出来的数据,要进行删除时,需使用Attach()。
using (var ctx = new LibingContext()) { var products = ctx.Products .AsNoTracking() .ToList(); var product = products.Where(t => t.ProductID == 1).FirstOrDefault(); //// 修改不用Attach //product.ProductName = "新名称"; //ctx.Entry(product).State = EntityState.Modified; ctx.Set<Product>().Attach(product); ctx.Entry(product).State = EntityState.Deleted; ctx.SaveChanges(); }