DbContext實例不能在OnConfiguring內使用,因為此時仍在配置它

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 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
    }

我的錯誤1:

處理請求時發生未處理的異常。 InvalidOperationException:未配置任何數據庫提供程序。在設置服務時,通過在DbContext類或AddDbContext方法中覆蓋OnConfiguring來配置數據庫提供程序。 Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)

錯誤2:

EntityFramework.Core.dll中出現“System.InvalidOperationException”類型的異常但未在用戶代碼中處理附加信息:嘗試在配置上下文時使用上下文。 DbContext實例不能在OnConfiguring內使用,因為此時仍在配置它。

我怎樣才能在一個類中使用dbcontext(我需要從DB獲取一些信息),該類應該放在Startup文件的Configure()方法中。

或者我可以將IViewLocation ..放到另一個地方嗎?

熱門答案

在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時不是第一次我沒有時間進一步研究這個




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因