生成Razor视图时遇DbContextOptions服务解析错误求助
问题描述
尝试通过Scaffold生成Razor视图时出现错误:
无法解析类型为'Microsoft.EntityFrameworkCore.DbContextOptions`1[DonnaPerfum.DataAccess.Data.ApplicationDbContext]'的服务,尝试激活'DonnaPerfum.DataAccess.Data.ApplicationDbContext'时出错。
相关代码
Program.cs 配置代码
var builder = WebApplication.CreateBuilder(args); // Add services to the container. var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); builder.Services.AddMvc(); builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddDatabaseDeveloperPageExceptionFilter(); builder.Services.AddDefaultIdentity<IdentityUser>(options=> options.SignIn.RequireConfirmedAccount = true).AddEntityFrameworkStores<ApplicationDbContext>(); builder.Services.AddScoped<IUnitOfWork, UnitOfWork>(); builder.Services.AddControllers(); builder.Services.AddControllersWithViews(); builder.Services.AddRazorPages().AddRazorRuntimeCompilation(); var app = builder.Build();
ApplicationDbContext 代码
using Donna.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; namespace DonnaPerfum.DataAccess.Data { public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options):base(options) { } public DbSet<Category> Categories { get; set; } } }
解决方案
该错误是因为Scaffold设计时工具无法自动获取DbContext的配置,需添加设计时工厂类来解决:
- 在
DonnaPerfum.DataAccess.Data命名空间下新增实现IDesignTimeDbContextFactory<ApplicationDbContext>的类:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; namespace DonnaPerfum.DataAccess.Data { public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> { public ApplicationDbContext CreateDbContext(string[] args) { IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>(); var connectionString = configuration.GetConnectionString("DefaultConnection"); optionsBuilder.UseSqlServer(connectionString); return new ApplicationDbContext(optionsBuilder.Options); } } }
- 确认
appsettings.json中存在正确的DefaultConnection连接字符串,示例格式:
{ "ConnectionStrings": { "DefaultConnection": "Server=你的服务器名;Database=你的数据库名;Trusted_Connection=True;TrustServerCertificate=True;" } }
- 重新运行Scaffold命令即可。
注:你的Program.cs中已正确注册DbContext服务,但设计时工具不会直接复用该配置,必须通过工厂类提供设计时的DbContext实例。
内容的提问来源于stack exchange,提问作者Razor
相关产品推荐
相关产品推荐

