如何使用EF Core 2.1.0和代理进行延迟加载

我有以下型号:

public class Session { public int SessionID { get; set; } public int UserID { get; set; } public virtual User User { get; set; } } public class User { public int UserID { get; set; } public int OrganizationID { get; set; } public virtual ICollection Sessions { get; set; } public virtual Organization Organization { get; set; } } public class Organization { public int OrganizationID { get; set; } public virtual ICollection Users { get; set; } } 

DbContext中注册为:

 modelBuilder.Entity(entity => { entity.ToTable("sessions"); entity.Property(e => e.SessionID).HasColumnName("id"); entity.Property(e => e.UserID).HasColumnName("user_id"); entity.HasOne(e => e.User) .WithMany(e => e.Sessions) .HasForeignKey(e => e.UserID); } modelBuilder.Entity(entity => { entity.ToTable("users"); entity.Property(e => e.UserID).HasColumnName("id"); entity.Property(e => e.OrganizationID).HasColumnName("organization_id"); entity.HasOne(e => e.Organization) .WithMany(e => e.Users) .HasForeignKey(e => e.OrganizationID); } modelBuilder.Entity(entity => { entity.ToTable("organizations"); entity.Property(e => e.OrganizationID).HasColumnName("id"); } 

我正在尝试使用延迟加载Microsoft.EntityFrameworkCore.Proxies如下所述:

 builder.Register(c => { var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder .UseLazyLoadingProxies() /* more options */ ; var opts = optionsBuilder.Options; return new Context(opts); }).As().InstancePerLifetimeScope(); 

我正在使用context.All查询会话。 但是,默认情况下, Session.UserSession.User.Organization为null。 要加载它们,我必须做类似context.All().Include(s => s.User).Include(s => s.User.Organization) 。 我怎么能避免这种情况? 为什么UseLazyLoadingProxies不起作用?


  • .NET核心版本: 2.1.300-preview2-008533
  • 目标: netcoreapp2.1
  • EF Core(和Proxies)版本: 2.1.0-preview2-final

您可以尝试在Startup.cs配置代理

 public void ConfigureServices(IServiceCollection services) { #region Database configuration // Database configuration services.AddDbContext(options => options.UseLazyLoadingProxies() .UseSqlServer(Configuration.GetConnectionString("MyConnectionString"))); #endregion Database configuration } 

顺便说一句,您已经可以将应用程序包更新为纯2.1.0(非最终版或RC版)。 配置可能不起作用的原因之一是组件的不稳定版本。

注意: Microsoft.EntityFrameworkCore.Proxies.dll是从nuget独立于EFCore安装的

在Asp.net Core 2.1中使用代理配置延迟加载的步骤

  1. 安装Microsoft.EntityFrameworkCore.Proxies包
  2. 启用LazyLoadingProxies您可以通过调用UseLazyLoadingProxies来启用它:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)=> optionsBuilder .UseLazyLoadingProxies()。UseSqlServer(myConnectionString);

或者在使用AddDbContext时:

 .AddDbContext( b => b.UseLazyLoadingProxies() .UseSqlServer(myConnectionString)); 
  1. 然后,EF Core将为任何可以覆盖的导航属性启用延迟加载 – 也就是说,它必须是虚拟的。