No se puede usar una instancia de DbContext dentro de OnConfiguring ya que todavía se está configurando en este punto

asp.net-core asp.net-core-mvc entity-framework-core razorengine

Pregunta

Estoy tratando de construir un sistema de ubicación de vista personalizado.

public class myViewLocationExpander : IViewLocationExpander
{
    private myDBContext _context;

    public myViewLocationExpander (myDBContext context)
    {
        _context = context;
    }

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
    {
        _context.Property.//..... //Error happened here
           Some other codes
    }

Y en mi archivo de inicio

public class myViewLocationExpander : IViewLocationExpander
{
    private myDBContext _context;

    public myViewLocationExpander (myDBContext context)
    {
        _context = context;
    }

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
    {
        _context.Property.//..... //Error happened here
           Some other codes
    }

Mi error 1:

Se produjo una excepción no controlada al procesar la solicitud. InvalidOperationException: no hay proveedores de bases de datos configurados. Configure un proveedor de base de datos anulando OnConfiguring en su clase DbContext o en el método AddDbContext al configurar los servicios. Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices (ServiceProviderSource providerSource)

Error 2:

Se produjo una excepción del tipo 'System.InvalidOperationException' en EntityFramework.Core.dll, pero no se manejó en el código de usuario. Información adicional: se intentó usar el contexto mientras se configuraba. Una instancia de DbContext no se puede usar dentro de OnConfiguring ya que todavía se está configurando en este punto.

¿Cómo puedo usar dbcontext (necesito obtener información de la base de datos) en una clase que debería colocarse en el método Configure() en el archivo de inicio?

¿O puedo poner IViewLocation ... a otro lugar?

Respuesta popular

En el código de su IViewLocationExpander puede obtener IServiceProvider del contexto usando el siguiente código context.ActionContext.HttpContext.ApplicationServices.GetService( typeof( myDbContext ) ) esto devolverá su DbContext.

public class MyViewLocationExpander : IViewLocationExpander
{
    public void PopulateValues( ViewLocationExpanderContext context )
    {
        var dbContext = context.ActionContext.HttpContext.ApplicationServices.GetService<ApplicationDbContext>();
    }

    public IEnumerable<string> ExpandViewLocations( ViewLocationExpanderContext context, IEnumerable<string> viewLocations )
    {
        var dbContext = context.ActionContext.HttpContext.ApplicationServices.GetService<ApplicationDbContext>();
        return viewLocations;
    }
}

Me di cuenta de que funciona la segunda vez que se llama PopulateValues, pero no la primera vez que no he tenido tiempo de profundizar en esto.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué