How to make lazy-loading work with EF Core 2.1.0 and proxies

.net-core asp.net-core c# entity-framework entity-framework-core

Question

I have the following models:

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<Session> Sessions { get; set; }
    public virtual Organization Organization { get; set; }
}

public class Organization
{
    public int OrganizationID { get; set; }

    public virtual ICollection<User> Users { get; set; }
}

that are registered in DbContext as:

modelBuilder.Entity<Session>(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<User>(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<Organization>(entity =>
{
    entity.ToTable("organizations");

    entity.Property(e => e.OrganizationID).HasColumnName("id");
}

I'm trying to use lazy loading with Microsoft.EntityFrameworkCore.Proxies as described here:

builder.Register(c =>
{
    var optionsBuilder = new DbContextOptionsBuilder<Context>();
    optionsBuilder
        .UseLazyLoadingProxies()
        /* more options */
        ;

    var opts = optionsBuilder.Options;

    return new Context(opts);
}).As<DbContext>().InstancePerLifetimeScope();

I'm querying sessions using context.All<Session>. However, Session.User and Session.User.Organization are null by default. To load them I have to do something like context.All<Session>().Include(s => s.User).Include(s => s.User.Organization). How can I avoid that? Why doesn't UseLazyLoadingProxies work?


  • .NET Core version: 2.1.300-preview2-008533
  • Target: netcoreapp2.1
  • EF Core (and Proxies) version: 2.1.0-preview2-final
1
15
5/4/2018 5:33:14 PM

Popular Answer

Steps To Configure Lazy Loading with Proxies in Asp.net Core 2.1

  1. Install Microsoft.EntityFrameworkCore.Proxies package
  2. Enable LazyLoadingProxies You can enable it with a call to UseLazyLoadingProxies:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLazyLoadingProxies()
        .UseSqlServer(myConnectionString);

Or when using AddDbContext:

.AddDbContext<BloggingContext>(
b => b.UseLazyLoadingProxies()
      .UseSqlServer(myConnectionString));
  1. EF Core will then enable lazy loading for any navigation property that can be overridden--that is, it must be virtual.
13
3/15/2019 7:47:53 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow