EntityFramework优化:查询性能

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();
}

猜你喜欢

转载自www.cnblogs.com/libingql/p/9060653.html