ASP.NET 5使用ApplicationDbContextFactory时如何正确注册DbContext
问题根本原因
IDesignTimeDbContextFactory<T> 接口的实现仅在EF Core执行设计时操作(如创建迁移、更新数据库)时生效,程序运行时不会自动调用该工厂创建AppDbContext实例,两个报错的逻辑分别是:
- 未在
Startup.cs中注册AppDbContext时,依赖注入容器没有对应服务的构建规则,自然会抛出服务无法解析的错误。 - 仅添加
services.AddDbContext<AppDbContext>()但未传入配置参数时,EF Core运行时初始化AppDbContext找不到对应的数据库连接配置,就会抛出配置缺失的错误,和设计时工厂无关。
解决方案(推荐方案1,符合.NET开发最佳实践)
方案1:统一在Startup中注册DbContext
- 在
Startup.cs的ConfigureServices方法中添加如下注册代码:
public void ConfigureServices(IServiceCollection services) { // 原有服务注册代码保留,新增DbContext注册 services.AddDbContext<AppDbContext>(options => { var connectionString = Configuration.GetConnectionString("DefaultConnection"); options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); }); services.AddControllers(); services.AddServices(); services.AddRepositories(); services.AddMappers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "RoomManagement", Version = "v1" }); }); }
- 在项目的
appsettings.json配置文件中添加连接字符串配置:
{ "ConnectionStrings": { "DefaultConnection": "server=127.0.0.1; port=3306; database=dbRoomManagement; uid=root; pwd=room123-pw" }, // 保留原有其他配置项 }
该方案无需保留自定义的ApplicationDbContextFactory类,EF Core的设计时操作会自动读取启动项目的配置创建DbContext实例,同时运行时的依赖注入也能正常解析服务。
方案2:运行时复用自定义工厂(不推荐)
如果你确实需要运行时也使用你写的工厂创建AppDbContext实例,可以直接按如下方式注册服务:
services.AddScoped<AppDbContext>(sp => { var factory = new ApplicationDbContextFactory(); return factory.CreateDbContext(System.Array.Empty<string>()); });
该方案硬编码了连接字符串,后续修改配置需要改动代码,不符合配置分离的开发规范。
内容的提问来源于stack exchange,提问作者André Luis Cardoso
相关产品推荐
相关产品推荐

