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

时间:2018-09-24 08:44:21

标签: entity-framework .net-core entity-framework-core lazy-loading

我将“读取上下文”与“立即写入”分开了,我将默认在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核心v 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:   尝试将导航属性“ PartnerUsers”延迟加载到   类型为“ PartnerProxy”的独立实体。不支持延迟加载   用于分离的实体或已加载的实体   'AsNoTracking()'。”。可以抑制或记录此异常   将事件ID'CoreEventId.DetachedLazyLoadingWarning'传递给   'DbContext.OnConfiguring'中的'ConfigureWarnings'方法或   “ AddDbContext”。

该问题如何解决?

2 个答案:

答案 0 :(得分:1)

您正在代码中的某个地方使用AsNoTracking(),使用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");
}

答案 1 :(得分:1)

如果您使用 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;
}

ProxyExtensions