DbContext实例不能在OnConfiguring中使用,因为此时仍在配置它

时间:2016-01-22 18:39:46

标签: asp.net-core asp.net-core-mvc entity-framework-core razorengine

我正在尝试构建自定义视图位置系统。

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
    }

在我的启动文件中

    public void ConfigureServices(IServiceCollection services)
    {
       //other codes

        services.AddMvc();

        services.Configure<RazorViewEngineOptions>(options =>
        {
            options.ViewLocationExpanders.Add(new myViewLocationExpander (new myDBContext()));
        });

我的错误1:

  

处理请求时发生未处理的异常。   InvalidOperationException:未配置任何数据库提供程序。在设置服务时,通过在DbContext类或AddDbContext方法中覆盖OnConfiguring来配置数据库提供程序。   Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)

错误2:

  

EntityFramework.Core.dll中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理   附加信息:尝试在配置上下文时使用上下文。 DbContext实例不能在OnConfiguring中使用,因为此时仍在配置它。

如何在类中使用dbcontext(我需要从DB获取一些信息),该类应放在启动文件的Configure()方法上。

或者我可以将IViewLocation ..放到另一个地方吗?

1 个答案:

答案 0 :(得分:0)

在IViewLocationExpander的代码中,您可以使用以下代码context.ActionContext.HttpContext.ApplicationServices.GetService( typeof( myDbContext ) )从上下文中获取IServiceProvider,这将返回您的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;
    }
}

我注意到它第二次调用PopulateValues时不是第一次我没有时间进一步研究这个