禁用延迟加载有危险吗?

凯夫

我有一个将实体框架用于数据层的ASP.NET MVC应用程序。

用我的一种方法,我检索了产品的季节性可用性数据,然后检索了该产品的最佳税率。

public ProductList FetchProductSearchList(ProductSearchCriteria criteria)
{
    ...
    var avail = ProductAvailabilityTemplate.Get(criteria.ProductID);
    ...
    var tr = TaxRate.BestMatchFor(criteria.ProductID, criteria.TaxCode);
    ...
}

在ProductAvailabilityTemplate.Get的数据层中,我一直在优化LINQ代码的性能。特别是,我已设置ctx.ObjectContext.ContextOptions.LazyLoadingEnabled = false;为防止EF加载某些情况下不需要的实体(通过导航属性)。

但是,一旦进行了此更改,我注意到我的TaxRates没有完全加载,因为ctx.ObjectContext.ContextOptions.LazyLoadingEnabled在我的Tax数据层代码中仍然为false。这意味着未加载通过导航属性链接到TaxRate的实体。

为了解决这个问题,我只需要ctx.ObjectContext.ContextOptions.LazyLoadingEnabled = true;在Tax数据层方法中进行设置,但是我担心不相关的更改可能会导致这样的问题。似乎您不能安全地禁用一项功能的延迟加载,而不会潜在地影响随后调用的功能。我很想删除所有导航属性,禁用延迟加载,并使用良好的老式联接完全加载我对每个数据层调用所需的内容,仅此而已。

欢迎任何建议。

丹尼尔·佩尔森

当我开始使用EF时,我很喜欢延迟加载,但是过了一会儿,我意识到它会影响性能,因为它可以有效地禁用联接并在单独的查询中提取所有子数据,即使您需要一次使用它们也是如此。

因此,现在我宁愿使用Includes来热切加载我感兴趣的子实体。您也可以稍微动态地进行此操作,例如通过提供一个includeDetails参数:

public IEnumerable<Customer> LoadCustomersStartingWithName(string name, bool includeDetails)
{
    using (var db = new MyContext())
    {
        var customers = db.Customers;
        if (includeDetails)
            customers = customers.Include(x => x.Orders).Include(x => x.ContactPersons);

        customers = customers.Where(x => x.Name.StartsWith(name));

        return customers;        
    }
}

为了使代码在EF6中正常工作,您还需要添加

using System.Data.Entity;

在全班最高

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章