在ASP.NET核心中使用上下文注入時發生InvalidOperationException [英] InvalidOperationException When using Context Injection in ASP.Net Core
本文介紹了在ASP.NET核心中使用上下文注入時發生InvalidOperationException的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
在我的ASP.NET核心Web應用程序中,我在啟動時使用以下命令連接到我的數據庫
services.AddDbContext<TimeSheetContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("AzureSql")));
在我嘗試在我的DBContext類上注入之前,這工作得很好。
我有一個獲取登錄用戶的接口和類
public interface IGetUserProvider
{
string UserName {get; }
int BranchID {get; }
}
public class GetUserProvider : IGetUserProvider
{
public string UserName { get; set; }
public int BranchID { get; set; }
public GetUserProvider(IHttpContextAccessor accessor)
{
UserName = accessor.HttpContext?.User.Claims.SingleOrDefault(x => x.Type == UserName)?.Value;
BranchID = 6108;
}
}
BranchID=6108將根據用戶名動態設置,但為了進行調試,我將自己設置它。
當我在程序中有這些類時,每當我在Web應用程序上選擇Razor頁面時,它都會拋出錯誤
InvalidOperationException:使用了命名連接字符串,但在應用程序的配置中找不到名稱""AzureSql""。
在后面的Razor代碼中調用上下文時發生異常,例如
public async Task OnGetAsync()
{
BranchHour = await _context.BranchHours
.Include(b => b.Branch)
.Where(d => d.BranchOpen.Date == DateTime.Today.Date)
.OrderBy(b => b.Branch.BranchNumber)
.ToListAsync();
}
正如我所說,代碼在沒有注入的情況下運行得很好,但是當它被注入時,它聲稱沒有名為AzureSql的連接字符串,而實際上顯然有。我不得不假設錯誤是由其他原因引起的,但我似乎找不到它。
使用數據庫上下文編輯
public TimeSheetContext(DbContextOptions<TimeSheetContext> options, IGetUserProvider userProvider)
: base(options)
{
User = userProvider.UserName;
branchFilter = userProvider.BranchID;
}
注入的原因是用作OnModel Creating中的全局篩選器
modelBuilder.Entity<Branch>().HasQueryFilter(b => b.ContractorCode == branchFilter);
推薦答案
通過刪除上下文中的空白構造函數解決了此問題。所有功勞都歸功于評論中的伊萬。
這篇關于在ASP.NET核心中使用上下文注入時發生InvalidOperationException的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!
查看全文