.NET 6多项目AWS Lambda中EF Migrations配置问题求助
解决AWS Lambda项目中EF Core迁移的DI配置问题
项目结构
ProjectName.Lambdas.Aggregator:基于Visual Studio AWS Lambda模板的函数项目,引用ProjectName.InfrastructureProjectName.Infrastructure:包含EF Core上下文、实体类、数据库相关逻辑的基础设施项目
问题现象
执行EF迁移命令:
dotnet ef migrations add InitialMigration --project ProjectName.Infrastructure --startup-project ProjectName.Lambdas.Aggregator
时出现错误:
System.InvalidOperationException: Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions' while attempting to activate 'SolutionName.ProjectName.Infrastructure.Persistence.Relational.Postgres.ApplicationContext'
原因
EF Core迁移工具不会触发Lambda函数的Function构造函数或Startup类的DI初始化逻辑,导致无法解析DbContextOptions依赖。
解决方案
方案1:实现IDesignTimeDbContextFactory(推荐)
在ProjectName.Infrastructure项目中添加一个设计时上下文工厂类,专门供EF迁移工具创建上下文实例,无需依赖Lambda的DI容器:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; namespace SolutionName.ProjectName.Infrastructure.Persistence.Relational.Postgres; public class ApplicationContextDesignTimeFactory : IDesignTimeDbContextFactory<ApplicationContext> { public ApplicationContext CreateDbContext(string[] args) { // 读取Lambda项目的配置文件,确保路径正确 var configBuilder = new ConfigurationBuilder() .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../ProjectName.Lambdas.Aggregator")) .AddJsonFile("appsettings.json", optional: false) .AddEnvironmentVariables(); var configuration = configBuilder.Build(); var options = new DbContextOptionsBuilder<ApplicationContext>() .UseNpgsql(configuration.GetConnectionString("ApplicationContext")) .Options; return new ApplicationContext(options); } }
添加完成后,重新执行迁移命令即可,EF工具会自动识别并使用这个工厂类。
方案2:给ApplicationContext添加设计时构造函数
在ApplicationContext类中添加一个仅用于迁移的无参构造函数,直接初始化DbContextOptions:
using SolutionName.ProjectName.Infrastructure.Persistence.Relational.Postgres.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using System.IO; namespace SolutionName.ProjectName.Infrastructure.Persistence.Relational.Postgres; public class ApplicationContext : DbContext { // 生产环境使用的DI注入构造 public ApplicationContext(DbContextOptions options) : base(options) { } // 仅用于EF迁移的设计时构造 public ApplicationContext() : base(GetDesignTimeOptions()) { } private static DbContextOptions GetDesignTimeOptions() { var configBuilder = new ConfigurationBuilder() .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../ProjectName.Lambdas.Aggregator")) .AddJsonFile("appsettings.json", optional: false) .AddEnvironmentVariables(); var configuration = configBuilder.Build(); return new DbContextOptionsBuilder<ApplicationContext>() .UseNpgsql(configuration.GetConnectionString("ApplicationContext")) .Options; } public DbSet<SessionEntity> Sessions { get; set; } }
注意:这个构造函数仅在迁移时使用,生产环境仍依赖DI注入的构造。
验证操作
确保迁移命令的参数正确:
dotnet ef migrations add InitialMigration --project ProjectName.Infrastructure --startup-project ProjectName.Lambdas.Aggregator
执行后即可生成初始迁移文件。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

