类库项目中通过Design Time DbContext Factory读取UserSecrets连接字符串
解决方案
1. 安装必要NuGet包
在Catalog.Data类库项目中执行以下命令,添加配置相关依赖:
dotnet add package Microsoft.Extensions.Configuration.UserSecrets dotnet add package Microsoft.Extensions.Configuration.Json
2. 修改CatalogDbContextFactory代码
更新配置构建逻辑,加载用户机密并修正配置文件路径:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.Reflection; using System.IO; public class CatalogDbContextFactory : IDesignTimeDbContextFactory<CatalogDbContext> { public CatalogDbContext CreateDbContext(string[] args) { // 获取类库程序集所在目录,确保定位到正确的appsettings.json var assembly = Assembly.GetExecutingAssembly(); var assemblyDir = Path.GetDirectoryName(assembly.Location); var configuration = new ConfigurationBuilder() .SetBasePath(assemblyDir) .AddJsonFile("appsettings.json", optional: false) // 加载当前类库项目的用户机密,泛型参数绑定Factory自身即可自动获取项目机密ID .AddUserSecrets<CatalogDbContextFactory>() .Build(); var connectionString = configuration.GetConnectionString(nameof(CatalogDbContext)); if (string.IsNullOrEmpty(connectionString)) { throw new InvalidOperationException("未找到名为CatalogDbContext的连接字符串"); } var optionsBuilder = new DbContextOptionsBuilder<CatalogDbContext>(); optionsBuilder.UseSqlServer(connectionString); return new CatalogDbContext(optionsBuilder.Options); } }
3. 验证用户机密配置
进入Catalog.Data项目目录,执行命令确认机密已正确配置:
dotnet user-secrets list
应输出包含ConnectionStrings:CatalogDbContext的完整连接字符串。
4. 重新执行迁移命令
回到Catalog.Api目录,重新运行迁移命令:
dotnet ef migrations add Catalog.Initial --project ..\Catalog.Data\Catalog.Data.csproj --verbose
关键说明
AddUserSecrets<T>():通过泛型参数绑定类库内的类型(如CatalogDbContextFactory),自动关联该项目的用户机密,无需手动指定机密ID。- 配置路径修正:使用类库程序集目录作为配置基路径,避免因命令执行目录不同导致找不到
appsettings.json的问题。 - 空值校验:添加连接字符串非空判断,抛出更明确的错误信息,便于排查。
内容的提问来源于stack exchange,提问作者Tech with Thiru
相关产品推荐
相关产品推荐

