Я использую EFCore 3.1.5, и у меня есть DbContext, который я хочу использовать в том же контроллере или службе, как ленивый, так и нетерпеливый. Однако, похоже, я не могу заставить его правильно загружать ленивый. Похоже, нетерпеливый работает нормально.
Всякий раз, когда я делаю что-то простое, как:
var users = await _lazyDbContext
.Users
.Take(10)
.ToListAsync();
каждое свойство навигации на каждом User
имеет значение NULL. Однако при активной загрузке все работает нормально:
var users = await _dbContext
.Users
.Include(x => x.Contact)
.Take(10)
.ToListAsync();
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<LazyUserContext>((sp, opt) =>
{
var connectionString = "very secret";
opt.UseSqlServer(connectionString, x => x.CommandTimeout(300));
opt.UseLazyLoadingProxies();
});
services.AddDbContext<UserContext>((sp, opt) =>
{
var connectionString = "very secret";
opt.UseSqlServer(connectionString, x => x.CommandTimeout(300));
});
services.AddScoped<IUserContext, UserContext>();
services.AddScoped<ILazyUserContext, LazyUserContext>();
}
UserContext.cs
public interface IUserContext
{
DbSet<User> Users { get; set; }
DbSet<Contact> Contacts { get; set; }
}
public class UserContext : DbContext, IUserContext
{
public UserContext(DbContextOptions<UserContext> options) : base(options) {}
public DbSet<User> Users { get; set; }
public DbSet<Contact> Contacts { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Users>(e =>
{
e.HasOne(x => x.Contact).WithOne(x => x.User).HasForeignKey(x => x.ContactId);
}
}
}
LazyUserContext.cs
public interface ILazyUserContext : IContext {}
public class LazyUserContext : UserContext, ILazyUserContext
{
public LazyUserContext(DbContextOptions<UserContext> options) : base(options) {}
}
В чем может быть проблема? Я попытался использовать IoC как для интерфейса, так и для класса в моем контроллере / службе. Я пробовал с services.AddScoped<>()
и без него.
Все, что я хочу, - это иметь возможность использовать ленивый dbContext или нетерпеливый dbContext, где я хочу по умолчанию использовать нетерпеливый.
opt.UseSqlServer(connectionString, x => x.CommandTimeout(300)); opt.UseLazyLoadingProxies();
такopt.UseLazyLoadingProxies(); opt.UseSqlServer(connectionString, x => x.CommandTimeout(300));
- person Seabizkit   schedule 16.06.2020LazyContext
материал, чтобы остался только 1 DbContext, ленивая загрузка сработает отлично. - person MortenMoulder   schedule 16.06.2020services.AddScoped<DbContext>(provider => provider.GetService<ParadoxCoreContext>());
это из моего собственного проекта, но подправьте его в соответствии с потребностями ... попробуйте это - person Seabizkit   schedule 16.06.2020services.AddEntityFrameworkProxies()
- person Neil   schedule 16.06.2020DbContext
- это настоящийDbContext
класс Entity Framework или мой LazyUserContext? Потому что нет, это не сработает. - person MortenMoulder   schedule 16.06.2020services.AddEntityFrameworkProxies()
перед обоими своимиservices.AddDbContext()
и пробовал добавить его после. - person MortenMoulder   schedule 16.06.2020services.AddScoped<ILazyUserContext, LazyUserContext>((provider => provider.GetService<LazyUserContext>() );
вам нужно указать регистру в версии с ограниченной областью действия, чтобы использовать уже определенную конструкцию, где вы указали UseLazyLoadingProxies, ну, это мое понимание, иначе какservices.AddScoped<ILazyUserContext, LazyUserContext>();
узнает, как построить LazyUserContext ... - person Seabizkit   schedule 16.06.2020