La carga anticipada no funciona con BackgroundService.
Estoy tratando de cargar entidades relacionadas en una aplicación de consola que ejecuta un servicio de fondo (BackgroundService), pero no carga entidades relacionadas. He tenido este problema durante horas y recién noté que solo ocurre en el BackgroundService, intenté el mismo DbContext en una aplicación web inyectando la clase DbContext en el modelo de página de Index, sin problemas.
Aquí está el código de la aplicación de consola:
El servicio de fondo:
public class MyService : BackgroundService
{
private readonly MyDbContext _context;
public MyService(MyDbContext context)
{
_context = context;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
//Jobs siempre vacío!
var theBatch = _context.Batches.Include(x => x.Jobs).FirstOrDefault();
}
}
El archivo del programa:
class Program
{
static async Task Main(string[] args)
{
using IHost host = CreateHostBuilder(args).Build();
await host.RunAsync();
}
static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
services.AddLogging()
.AddDbContext<mydbcontext>(options => options
.UseSqlServer(context.Configuration.GetConnectionString("MyConnection")))
.AddHostedService<myservice>()
.BuildServiceProvider();
});
}
Estoy usando .NET 5 y EF Core 5.0.12.
davy.ai
Parece que estás teniendo problemas para cargar entidades relacionadas en una aplicación de consola que ejecuta un
BackgroundService
, específicamente en la claseMyService
. Has notado que el mismoDbContext
funciona bien en una aplicación web al inyectar la claseDbContext
en el modelo de página Index.Has proporcionado el código para la clase
MyService
y el archivoProgram
, que muestra que estás usando .NET 5 y EF Core 5.0.12. En la claseMyService
, estás inyectando la claseMyDbContext
en el constructor y tratando de cargar entidades relacionadas usando el métodoInclude
, pero siempre devuelve vacío.Una cosa a verificar es si la propiedad
Jobs
en la entidadBatch
está marcada como virtual o no. Si no está marcado como virtual, la carga diferida no funcionará, y es posible que debas usar carga ansiosa para cargar entidades relacionadas.Otra cosa a verificar es si has configurado correctamente las relaciones en tus clases de entidad. Asegúrate de haber definido las propiedades de navegación en ambos lados de la relación, y de haber configurado las relaciones en el método
OnModelCreating
de tu claseDbContext
.Finalmente, puedes intentar usar el método
AsNoTracking
antes de llamar al métodoInclude
para ver si esto ayuda. Este método le indica a EF Core que no realice un seguimiento de los cambios en las entidades que se devuelven, lo que puede ayudar con el rendimiento y reducir el uso de memoria.En general, parece que puede haber un problema con cómo estás configurando tus entidades y relaciones, o con cómo estás usando la carga diferida y la carga ansiosa. Examina más de cerca esas áreas, y considera depurar el código para ver qué sucede cuando intentas cargar las entidades relacionadas.