EF Core - 如何在Entity Framework Core中启用延迟加载?

5

我已经将读取上下文与写入分开,现在我将默认启用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 Core 版本 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' 方法来抑制或记录。”
如何解决这个问题?

@Eldho 我编辑了这篇文章。 - John
1
你的导航被标记为虚拟以进行延迟加载。请查看以下链接: https://learn.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading - Eldho
@Eldho,我按照你发送的链接上的指示做了,但问题仍未解决。 - John
你有收到任何错误吗?你如何评估这个问题? - Eldho
'((Castle.Proxies.PartnerProxy)result).PartnerUsers' 抛出了 'System.InvalidOperationException' 类型的异常。 - John
显示剩余7条评论
2个回答

8
您的代码中使用了AsNoTracking()方法,这会导致延迟加载失效。您有两个选择:
  1. 使用Include()方法加载相关联的数据。

  2. 忽略警告,获取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");
}

2
如果您正在使用UseLazyLoadingProxies(),则必须使用CreateProxy()来启用延迟加载。
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;
}

代理扩展


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接