我有一个将实体框架用于数据层的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] 删除。
我来说两句