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

.NET 6多项目AWS Lambda中EF Migrations配置问题求助

解决AWS Lambda项目中EF Core迁移的DI配置问题

项目结构

  • ProjectName.Lambdas.Aggregator:基于Visual Studio AWS Lambda模板的函数项目,引用ProjectName.Infrastructure
  • ProjectName.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:31:12