Blazor Server使用IDesignTimeDbContextFactory出现服务无法解析问题
问题原因
你的错误是由两个核心的认知偏差和配置错误共同导致的:
- 首先你混淆了两种EF Core工厂接口的用途:
IDesignTimeDbContextFactory<TContext>仅用于EF Core设计时操作(比如执行迁移、数据库更新命令),不需要注册到DI容器,也不应该在运行时业务代码中使用- Blazor Server运行时推荐使用的泛型
IDbContextFactory<TContext>(位于Microsoft.EntityFrameworkCore命名空间下)并未弃用,你查到的弃用信息是早期非泛型版IDbContextFactory的过时提示
- 你调用
services.AddDbContextFactory<FIS2_DbContext>()注册的是微软官方提供的IDbContextFactory<FIS2_DbContext>接口实现,但你的业务服务中注入的是你自行实现的FIS2ContextFactory类,DI容器中没有该类的注册信息,自然会抛出无法解析服务的错误。
修复步骤
- 删除自行实现的
FIS2ContextFactory类,运行时的上下文工厂由AddDbContextFactory方法自动提供默认实现,无需手动实现。 - 修改所有业务服务的注入逻辑,将注入自定义工厂改为注入官方泛型工厂接口,创建上下文时无需传入空数组参数,同时建议加
using自动释放上下文:
public class TimetableService : ITimetableService { private readonly IDbContextFactory<FIS2_DbContext> _contextFactory; // 注入官方提供的泛型工厂接口 public TimetableService(IDbContextFactory<FIS2_DbContext> dbFactory) { _contextFactory = dbFactory; } public async Task<List<spGetHolidaysBetweenDatesResult>> GetHolidaysBetweenDatesAsync(DateTime startDate, DateTime endDate) { // 直接调用CreateDbContext方法,using自动释放上下文 using var _db = _contextFactory.CreateDbContext(); var procedures = _db.Procedures; return await procedures.spGetHolidaysBetweenDatesAsync(startDate, endDate); } // 其余所有方法按相同逻辑修改即可 }
- 给自定义
FIS2_DbContext新增构造函数,默认工厂会传入DbContextOptions<FIS2_DbContext>类型的配置参数,你当前只有接收父类上下文配置的构造,会导致上下文创建失败:
public partial class FIS2_DbContext : FIS2_FranklinContext_AutoGenerated { public FIS2_DbContext() { } public FIS2_DbContext(DbContextOptions<FIS2_FranklinContext_AutoGenerated> options) : base(options) { } // 新增该构造函数,适配工厂传入的配置参数 public FIS2_DbContext(DbContextOptions<FIS2_DbContext> options) : base(options) { } // 原有DbSet定义保持不变 public virtual DbSet<StudentBasicDetailsWithCurrentTg> StudentBasicDetailsWithCurrentTgs { get; set; } public virtual DbSet<CurriculumSearchBasicDetails> CurriculumSearchBasicDetails { get; set; } public virtual DbSet<StudentAllEnrolments> StudentAllEnrolments { get; set; } }
- 你
Startup.cs中现有的AddDbContextFactory配置无需修改,保持原有配置即可正常运行。
内容的提问来源于stack exchange,提问作者Andrew Corrigan
相关产品推荐
相关产品推荐

