当前位置: 首页 > 知识库问答 >
问题:

EF Core-如何在实体框架核心中启用延迟加载?

朱越
2023-03-14

我已经将读上下文和写上下文分开了,现在我将在默认情况下在ReadOnlyContext中启用LazyLoading。我也使用了下面的方法,但不幸的是它不起作用。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseLazyLoadingProxies()
        .UseSqlServer(@"Data Source=.;Initial Catalog=UniversityDb;Persist Security Info=True;User ID=admin;Password=asdasdsadasd");
}

我的模型:

public class Partner : BaseEntity<int>
{
    public string Name { get; set; }
    public DateTime CreateDate { get; set; }
    public bool IsDisabled { get; set; }
    public bool IsDeleted { get; set; }
    public virtual ICollection<PartnerUser> PartnerUsers { get; set; }
}

我的ef版本:

EntityFramework核心版本2.1.2

public async Task<PartnerQuery> Get(int id)
{
    var result = await _partnerDbSet.SingleAsync(c => c.Id == id);
    var list = result.PartnerUsers;
    return new PartnerQuery()
    {
        CreateDate = result.CreateDate,
        Name = result.Name,
        Id = result.Id
    };
}

我得到了这个错误:

“为警告‘Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning’生成错误:尝试在类型为‘PartnerProxy’的分离实体上延迟加载导航属性‘PartnerUsers’。分离实体或使用‘AsNoTracking()加载的实体不支持延迟加载。”“.”。通过将事件ID“CoreEventId.DetachedLazyLoadingWarning”传递给“DbContext.OnConfiguring”或“AddDbContext”中的“ConfigureWarnings”方法,可以抑制或记录此异常。”

如何解决这个问题?

共有2个答案

东门宜
2023-03-14

如果您使用UseLazyLoadingProxies(),则必须使用CreateProxy()来启用Lazy加载。

public async Task<PartnerQuery> Get(int id)
{
  var result = await _partnerDbSet.SingleAsync(c => c.Id == id);
  var list = result.PartnerUsers;
  // assuming you have access to your database context
  var model = myDatabaseContext.CreateProxy<PartnerQuery>();

  model.CreateDate = result.CreateDate;
  model.Name = result.Name;
  model.Id = result.Id;

  return model;
}

代理扩展

强才捷
2023-03-14

您在代码中的某个地方使用了AsNoTrack(),当使用AsNoTrack()方法时,懒惰加载将不起作用。

您有两个选择:

>

忽略警告,只需为您的关系获取null

您可以将EF配置为忽略此错误:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseLazyLoadingProxies()
        .ConfigureWarnings(warnings => warnings.Ignore(CoreEventId.DetachedLazyLoadingWarning))
        .UseSqlServer(@"Data Source=.;Initial Catalog=UniversityDb;Persist Security Info=True;User ID=admin;Password=asdasdsadasd");
}
 类似资料:
  • 当将实体模型转换为DTO时,我对Entity Framework Core(v2.0.1)有一个问题。基本上,通过该短语的任何其他版本,当我不想加载时,它是延迟加载的。这是一个简单的。NET Core Console应用程序(带有Microsoft. EntityFrameworkCore. SqlServer(2.0.1)包)。 现在,当执行方法来检索数据时,它正在执行以下SQL 如您所见,它没

  • 我从这个网站上读到了关于懒惰加载的内容。启用或禁用LazyLoding “如果我们请求已启用LazyLoading的学生列表,数据提供程序将从数据库中获取所有学生,但每个StudentAddress属性在显式访问该属性之前不会加载。” 此语句表示,当我将设置为true时,将不会加载相关数据。然而 如果我设置延迟加载启用=true,上面的代码返回所有特技与他们的老师和地址。我在这里错过了什么?有人能

  • 考虑以下(非常简化的)实体: 在我的映射器中,我可以设置用户罚款,但是一旦执行以下代码(在数据库中保留任何更改之前)

  • 我正在使用启用延迟加载的实体框架5。我有以下代码: 但这有意义吗?我想确保公共属性订阅从不为null。由于虚拟实体框架覆盖了getter和setter以提供延迟加载功能。 我需要这个字段还是我可以只使用一个自动属性,如果没有订阅,我得到一个空列表?

  • 当我从主viewController重定向到另一个viewController时,我得到了这个。 错误: Lazy 加载 NSBundle MobileCoreServices.framework, 已加载MobileCoreServices.framework, system group . com . apple . configuration profiles的系统组容器路径为/Users/

  • 我听说应该在web应用程序中禁用EF的延迟加载功能。(ASP.NET)。首先,这里和这里。 现在我真的很困惑,因为我一直认为应该始终启用延迟加载,因为它可以防止从数据库中获取不必要的数据。所以,现在我的问题是:从性能角度来看,在网络应用中禁用懒惰加载是否是一个更好的主意。如果是,你能解释一下原因吗?