web-dev-qa-db-ja.com

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

here で説明されているように、_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(およびプロキシ)バージョン:_2.1.0-preview2-final_
13
KolesnichenkoDS

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は、オーバーライドできるナビゲーションプロパティの遅延読み込みを有効にします。つまり、仮想プロパティである必要があります。
11
Johar Zaman

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版でもない)に更新できます。構成が機能しない理由の1つは、コンポーネントの不安定なバージョンです。

注意:Microsoft.EntityFrameworkCore.Proxies.dllはEFCoreとは別にnugetからインストールされます

8
Artem Fomin

この答えのようなサービスでJSONシリアル化を設定することでこれを解決しました https://stackoverflow.com/a/49350457/4178475

0
Mosta