私は次のモデルを持っています:
_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
が機能しないのはなぜですか?
2.1.300-preview2-008533
_netcoreapp2.1
_2.1.0-preview2-final
_Asp.net Core 2.1でプロキシを使用した遅延読み込みを構成する手順
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString);
または、AddDbContextを使用する場合:
.AddDbContext<BloggingContext>(
b => b.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString));
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からインストールされます
この答えのようなサービスでJSONシリアル化を設定することでこれを解決しました https://stackoverflow.com/a/49350457/4178475