我在為我的服務器端 Blazor 應用程式設定 EF 資料庫連接時遇到了一些問題。它一直在使用標準DbContext設定,直到我注意到由于 Blazor 的性質而導致連接無法正確關閉的一些問題,始終使用相同的背景關系。我的研究讓我看了一下DbContextFactory,但IDbContextFactory現在不推薦使用該界面而支持IDesignTimeDbContextFactory.
我已經建立了一個類來實作介面:
public class FIS2ContextFactory : IDesignTimeDbContextFactory<FIS2_DbContext>
{
private readonly DbContextOptions<FIS2_FranklinContext_AutoGenerated> options;
public FIS2ContextFactory(DbContextOptions<FIS2_FranklinContext_AutoGenerated> contextOptions)
{
options = contextOptions;
}
public FIS2_DbContext CreateDbContext(string[] args)
{
return new FIS2_DbContext(options);
}
}
我要使用的 DbContext 是這樣的,它繼承并擴展了 EF Power Tools 生成的 DbContext:
public partial class FIS2_DbContext : FIS2_FranklinContext_AutoGenerated
{
public FIS2_DbContext()
{
}
public FIS2_DbContext(DbContextOptions<FIS2_FranklinContext_AutoGenerated> options) : base(options)
{
}
public virtual DbSet<StudentBasicDetailsWithCurrentTg> StudentBasicDetailsWithCurrentTgs { get; set; }
public virtual DbSet<CurriculumSearchBasicDetails> CurriculumSearchBasicDetails { get; set; }
public virtual DbSet<StudentAllEnrolments> StudentAllEnrolments { get; set; }
}
在我的方法中,startup.cs我將它設定為這樣ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContextFactory<FIS2_DbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("FIS2")));
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddScoped<IFileService, FileService>();
services.AddScoped<IEmailService, EmailService>();
services.AddScoped<ITimetableService, TimetableService>();
services.AddScoped<ICurriculumService, CurriculumServiceEf>();
services.AddScoped<IStudentService, StudentServiceEf>();
services.AddScoped<ICollectionService, CollectionsServiceEf>();
services.AddHttpContextAccessor();
services.AddHttpClient();
services.AddAuthenticationCore();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization();
services.AddSyncfusionBlazor();
services.AddScoped<SessionState>();
}
我的問題是,當它開始設定使用此資料庫連接的服務時,我在以下位置遇到此錯誤訊息program.cs:
無法構建某些服務(驗證服務描述符時出錯:“ServiceType: DataLibrary.Data.Interfaces.ITimetableService Lifetime: Scoped ImplementationType: DataLibrary.Data.BusinessLayer.TimetableService”:無法決議“DataLibrary.Models”型別的服務。 FIS2ContextFactory 試圖激活“DataLibrary.Data.BusinessLayer.TimetableService”。)(驗證服務描述符“ServiceType: DataLibrary.Data.Interfaces.ICurriculumService Lifetime: Scoped ImplementationType: DataLibrary.Data.BusinessLayer.CurriculumServiceEf”時出錯:無法嘗試激活“DataLibrary.Data.BusinessLayer.CurriculumServiceEf”時決議型別“DataLibrary.Models.FIS2ContextFactory”的服務。(驗證服務描述符時出錯)ServiceType:DataLibrary.Data.Interfaces.IStudentService Lifetime:Scoped ImplementationType:DataLibrary.Data.BusinessLayer.StudentServiceEf':嘗試激活'DataLibrary.Data.BusinessLayer.StudentServiceEf'時無法決議型別'DataLibrary.Models.FIS2ContextFactory'的服務。 )(驗證服務描述符“ServiceType: DataLibrary.Data.Interfaces.ICollectionService Lifetime: Scoped ImplementationType: DataLibrary.Data.BusinessLayer.CollectionsServiceEf”時出錯:嘗試激活“DataLibrary.Models.FIS2ContextFactory”時無法決議“DataLibrary.Models.FIS2ContextFactory”型別的服務DataLibrary.Data.BusinessLayer.CollectionsServiceEf'.)嘗試激活“DataLibrary.Data.BusinessLayer.StudentServiceEf”時無法決議“DataLibrary.Models.FIS2ContextFactory”型別的服務。(驗證服務描述符“ServiceType: DataLibrary.Data.Interfaces.ICollectionService Lifetime: Scoped ImplementationType”時出錯: DataLibrary.Data.BusinessLayer.CollectionsServiceEf”:嘗試激活“DataLibrary.Data.BusinessLayer.CollectionsServiceEf”時無法決議“DataLibrary.Models.FIS2ContextFactory”型別的服務。)嘗試激活“DataLibrary.Data.BusinessLayer.StudentServiceEf”時無法決議“DataLibrary.Models.FIS2ContextFactory”型別的服務。(驗證服務描述符“ServiceType: DataLibrary.Data.Interfaces.ICollectionService Lifetime: Scoped ImplementationType”時出錯: DataLibrary.Data.BusinessLayer.CollectionsServiceEf”:嘗試激活“DataLibrary.Data.BusinessLayer.CollectionsServiceEf”時無法決議“DataLibrary.Models.FIS2ContextFactory”型別的服務。)DataLibrary.Data.BusinessLayer.CollectionsServiceEf”:嘗試激活“DataLibrary.Data.BusinessLayer.CollectionsServiceEf”時無法決議“DataLibrary.Models.FIS2ContextFactory”型別的服務。)DataLibrary.Data.BusinessLayer.CollectionsServiceEf”:嘗試激活“DataLibrary.Data.BusinessLayer.CollectionsServiceEf”時無法決議“DataLibrary.Models.FIS2ContextFactory”型別的服務。)
作為參考,這里是如何TimetableService設定的示例(其他以相同方式實體化):
using DataLibrary.Data.Interfaces;
using DataLibrary.Models;
using DataLibrary.Models.timetable;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace DataLibrary.Data.BusinessLayer
{
public class TimetableService : ITimetableService
{
private FIS2ContextFactory _contextFactory;
public TimetableService(FIS2ContextFactory db)
{
_contextFactory = db;
}
public async Task<List<spGetHolidaysBetweenDatesResult>> GetHolidaysBetweenDatesAsync(DateTime startDate, DateTime endDate)
{
string[] args = { "" };
var _db = _contextFactory.CreateDbContext(args);
var procedures = _db.Procedures;
return await procedures.spGetHolidaysBetweenDatesAsync(startDate, endDate);
}
public async Task<List<PeriodsBetweenDates>> GetPeriodsBetweenDatesAsync(DateTime startDate, DateTime endDate)
{
string[] args = { "" };
var _db = _contextFactory.CreateDbContext(args);
var procedures = _db.Procedures;
var toReturn = new List<PeriodsBetweenDates>();
var results = await procedures.spGetPeriodsBetweenDatesAsync(startDate, endDate);
foreach (var item in results)
{
toReturn.Add(new PeriodsBetweenDates(item.Date, item.Timetable, item.BlockCode, item.StartTime, item.EndTime));
}
return toReturn;
}
public async Task<List<StudentTimetable>> GetStudentTimetableAsync(DateTime startDate, DateTime endDate, string studentID)
{
string[] args = { "" };
var _db = _contextFactory.CreateDbContext(args);
var procedures = _db.Procedures;
var results = await procedures.spGetStudentTimetableAsync(startDate, endDate, studentID);
List<StudentTimetable> studentTimetables = new List<StudentTimetable>();
foreach (var item in results)
{
studentTimetables.Add(JsonConvert.DeserializeObject<StudentTimetable>(item.timetable));
}
return studentTimetables;
}
}
}
是因為我在啟動時使用了錯誤的方法來創建背景關系工廠,還是后來我出錯了?
uj5u.com熱心網友回復:
如果要決議特定的工廠型別,則必須注冊此多載,AddDbContextFactory<TContext,TFactory>記錄在此處:
此多載允許注冊 IDbContextFactory 的特定實作,而不是使用 EF Core 附帶的默認工廠。
所以
services.AddDbContextFactory<FIS2_DbContext,FIS2ContextFactory>(options => options.UseSqlServer(Configuration.GetConnectionString("FIS2")));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/370625.html
標籤:实体框架 依赖注入 实体框架核心 blazor 服务器端 数据库上下文
上一篇:背景視窗和主視窗tkinter
