【问题标题】:Combining lazy and eager loading in EF在 EF 中结合惰性加载和急切加载
【发布时间】:2016-08-31 09:41:31
【问题描述】:

我想知道是否可以结合惰性加载和急切加载。 例如,我有一个带有 GET 方法的 Web Api 控制器,不需要加载相关实体数据,但我还有另一个 Web Api 控制器,它的方法 GET 需要从相关实体中检索数据。

将这两种方法结合起来是一种好习惯吗?我需要设置任何特定的配置吗?

【问题讨论】:

  • 可以将这两者结合起来,但是您指定的场景只能使用急切加载来完成。如果可能的话,最好只坚持一种方法。
  • 我想知道这个问题是否可能比基于“良好实践”的问题更基于意见......
  • 当然是基于意见的。我们如何在不知道任何要求的情况下推荐任何好的做法?
  • 不需要任何要求,我只是想知道我是否有100个Web Api控制器,每个控制器都有自己的GET方法,其中50个需要检索相关实体,其他50个才不是。如何才能让我的应用程序尽可能快地运行。
  • 每个案例的答案都不同。所以这就是你的答案:是的,结合加载策略是一种很好的做法。

标签: entity-framework asp.net-web-api2 lazy-loading eager-loading


【解决方案1】:

是的,您可以这样做。根据您的实际情况,这也是一种很好的做法。

当您不需要 Lazyloding 时,您可以在该特定方法上禁用它,如下所示。

public List<PropertyListDto> SearchProperties(AdditionalSearchInput input)
{
   _context.Configuration.LazyLoadingEnabled = false;//to remove lazy loading

  ///your code
}

注意:在 Entity Framework 4 及更高版本中默认启用延迟加载。我们可以在全局范围内disable 它,在DbContext 级别上,或选择性地在query level 上,如上所示。

这是在DbContext 级别上的操作方法。

public partial class MyDBEntities : DbContext
    {
        public MyDBEntities(): base("name=MyDBEntities")
        {
            this.Configuration.LazyLoadingEnabled = false;
        }
    }

更新:不需要lazyloding的50个控制器可以在constractor级别禁用它,如下所示。然后您不要需要在每个方法上在query level 上给出它。我认为这是实现它的非常快速的方法:)

public class YourAppService : IYourAppService
    {
        private readonly YourDbContext _context;

        public YourAppService(YourDbContext context)
        {
            _context = context;
            _context.Configuration.LazyLoadingEnabled = false;//to remove lazy loading
        }
}

【讨论】:

  • 延迟加载是否默认开启?那么,如果我需要使用急切加载,我会按照您现在的说明进行操作?
  • 是的,默认情况下它是on。是的,当您使用Eager loading 时,您可以如上所示进行操作。
  • 如果我这样做this.Configuration.LazyLoadingEnabled = false;,我应该使用 Include 方法在每个方法上实现预加载还是?基于这个配置,GET方法的结果是什么(相关实体是否加载)?
  • 请参阅Update 部分。
  • 没问题。如果您需要了解更多相关信息,请随时再次询问:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2018-11-06
  • 1970-01-01
相关资源
最近更新 更多