使用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
相关产品推荐
相关产品推荐

