У меня есть следующие модели:
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?
2.1.300-preview2-008533netcoreapp2.12.1.0-preview2-finalЕсли честно, а ленивая загрузка действительно нужна? Я пробовал это с полным EF и нашел это не очень полезным, поскольку он работает только до тех пор, пока у вас есть ваш контекст, поэтому, если вы хотите просто получить всю информацию, вам все равно придется вручную загружать все свойства или поддерживать контекст. Я создал методы расширения для DbSets, такие как BuildSession, BuldUser, которые содержат все, что мне нужно.





Вы можете попробовать настроить прокси в 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). Одна из причин, по которой ваша конфигурация может не работать, - нестабильная версия компонентов.
NB: Microsoft.EntityFrameworkCore.Proxies.dll устанавливается из nuget независимо от EFCore
Шаги по настройке отложенной загрузки с прокси в Asp.net Core 2.1
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString);
Или при использовании AddDbContext:
.AddDbContext<BloggingContext>(
b => b.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString));
Я решил это, установив сериализацию JSON в сервисе, как этот ответ https://stackoverflow.com/a/49350457/4178475
Вам довелось найти решение? Имея ту же проблему