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

使用EF生成MVC控制器视图时出现DbContextOptions解析错误

问题:使用EF脚手架生成带视图的MVC控制器时出现依赖注入错误

错误信息

Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[OnlineShop.Data.OnlineShopDbContext]' while attempting to activate 'OnlineShop.Data.OnlineShopDbContext'.

问题描述

我排查到相关问题都指向服务注册,但我已经完成了正确的服务注册配置。我的OnlineShopDbContext位于独立的OnlineShop.Data类库项目中,主项目已引用该类库,且生成顺序为优先编译Data项目再编译主项目。奇怪的是,当把OnlineShopDbContext移到主项目内时,脚手架就能正常生成代码。

相关代码

Program.cs(主项目)

using Microsoft.EntityFrameworkCore;
using OnlineShop.Data;

internal class Program
{
    private static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        // 注册服务
        builder.Services.AddControllersWithViews();
        builder.Services.AddDbContext<OnlineShopDbContext>(options => 
            options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

        var app = builder.Build();

        // 配置HTTP请求管道
        if (!app.Environment.IsDevelopment())
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");

        app.Run();
    }
}

OnlineShopDbContext.cs(OnlineShop.Data类库)

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using OnlineShop.Data.Entities;

namespace OnlineShop.Data
{
    public class OnlineShopDbContext : DbContext
    {
        public OnlineShopDbContext(DbContextOptions<OnlineShopDbContext> options) : base(options) { }

        public DbSet<Customer> Customers { get; set; }
        public DbSet<Employee> Employees { get; set; }
        public DbSet<Order> Orders { get; set; }
        public DbSet<Product> Products { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<UserAccount> UserAccounts { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder
                .Entity<Order>()
                .Property(order => order.OrderStatus)
                .HasConversion(new EnumToStringConverter<OrderStatus>());
        }
    }
}

解决方法

  • 给类库项目添加配置文件:在OnlineShop.Data项目中新建appsettings.json,复制主项目的DefaultConnection连接字符串,设置文件属性为「复制到输出目录:如果较新则复制」,让脚手架工具能读取到配置。
  • 通过Package Manager Console指定项目:打开控制台,选择主项目为默认项目,执行命令:
    Scaffold-DbContext "你的连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context OnlineShopDbContext -Project OnlineShop.Data -StartupProject 你的主项目名称
    
  • 统一NuGet包版本:确保主项目和Data项目的Microsoft.EntityFrameworkCore系列包版本完全一致,版本不匹配会导致依赖识别失败。
  • 临时添加无参构造函数:在OnlineShopDbContext中添加无参构造函数(仅用于脚手架生成):
    public OnlineShopDbContext() : base() { }
    
    生成完成后可删除该构造函数,不影响生产环境的依赖注入逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:48:24