Как заставить работать отложенную загрузку с EF Core 2.1.0 и прокси - PullRequest
0 голосов
/ 04 мая 2018

У меня есть следующие модели:

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; }
}

, которые зарегистрированы в DbContext как:

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");
}

Я пытаюсь использовать отложенную загрузку с Microsoft.EntityFrameworkCore.Proxies, как описано здесь :

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

    var opts = optionsBuilder.Options;

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

Я запрашиваю сессии, используя context.All<Session>. Однако Session.User и Session.User.Organization по умолчанию не имеют значения. Чтобы загрузить их, я должен сделать что-то вроде context.All<Session>().Include(s => s.User).Include(s => s.User.Organization). Как я могу избежать этого? Почему UseLazyLoadingProxies не работает?


  • .NET Core версия: 2.1.300-preview2-008533
  • Цель: netcoreapp2.1
  • EF Core (и Proxies) версия: 2.1.0-preview2-final

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Шаги для настройки отложенной загрузки с прокси в Asp.net Core 2.1

  1. Установить пакет Microsoft.EntityFrameworkCore.Proxies
  2. Включить LazyLoadingProxies Вы можете включить его с помощью вызова UseLazyLoadingProxies:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLazyLoadingProxies()
        .UseSqlServer(myConnectionString);

Или при использовании AddDbContext:

.AddDbContext<BloggingContext>(
b => b.UseLazyLoadingProxies()
      .UseSqlServer(myConnectionString));
  1. EF Core затем включит отложенную загрузку для любого свойства навигации, которое может быть переопределено, то есть оно должно быть виртуальным.
0 голосов
/ 27 марта 2019

Я решил это, установив сериализацию JSON в сервис, как этот ответ https://stackoverflow.com/a/49350457/4178475

0 голосов
/ 06 июня 2018

Вы можете попытаться настроить прокси в Startup.cs как

public void ConfigureServices(IServiceCollection services)
{
    #region Database configuration

    // Database configuration
    services.AddDbContext<DbContext>(options =>
        options.UseLazyLoadingProxies()
            .UseSqlServer(Configuration.GetConnectionString("MyConnectionString")));

    #endregion Database configuration
}

И, кстати, вы уже можете обновить свои пакеты приложений до версии 2.1.0 (не финальной или RC). Одна из причин, по которой ваша конфигурация может не работать, - нестабильная версия компонентов.

Примечание: Microsoft.EntityFrameworkCore.Proxies.dll устанавливается из nuget независимо от EFCore

...