es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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 clase MyService. Has notado que el mismo DbContext funciona bien en una aplicación web al inyectar la clase DbContext en el modelo de página Index.

    Has proporcionado el código para la clase MyService y el archivo Program, que muestra que estás usando .NET 5 y EF Core 5.0.12. En la clase MyService, estás inyectando la clase MyDbContext en el constructor y tratando de cargar entidades relacionadas usando el método Include, pero siempre devuelve vacío.

    Una cosa a verificar es si la propiedad Jobs en la entidad Batch 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 clase DbContext.

    Finalmente, puedes intentar usar el método AsNoTracking antes de llamar al método Include 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.

Comments are closed.