You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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容器中没有该类的注册信息,自然会抛出无法解析服务的错误。

修复步骤
  1. 删除自行实现的FIS2ContextFactory类,运行时的上下文工厂由AddDbContextFactory方法自动提供默认实现,无需手动实现。
  2. 修改所有业务服务的注入逻辑,将注入自定义工厂改为注入官方泛型工厂接口,创建上下文时无需传入空数组参数,同时建议加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);
    }
    // 其余所有方法按相同逻辑修改即可
}
  1. 给自定义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; }
}
  1. 你Startup.cs中现有的AddDbContextFactory配置无需修改,保持原有配置即可正常运行。

内容的提问来源于stack exchange,提问作者Andrew Corrigan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:45:05