Entity Framework Core中DbContext连接字符串及迁移相关疑问
解决方案
一、让AppSecurityDataContext获取引用项目的连接字符串
类库本身不应该直接读取宿主项目的配置文件,正确的做法是让宿主项目(Acme.Widgets)主动传入连接字符串,在类库中提供注册DbContext的扩展方法:
- 在Framework.AppSecurity项目中添加DbContext注册扩展:
using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace Framework.AppSecurity; public static class AppSecurityDbContextExtensions { // 扩展方法,接收宿主传入的连接字符串 public static IServiceCollection AddAppSecurityDbContext(this IServiceCollection services, string connectionString) { services.AddDbContext<AppSecurityDataContext>(options => // 根据你的数据库类型调整,比如UseSqlServer/UseMySql等 options.UseSqlServer(connectionString)); return services; } }
- 在Acme.Widgets项目的Program.cs中注册:
var builder = WebApplication.CreateBuilder(args); // 从自身的appsettings.json读取连接字符串 var acmeDbConn = builder.Configuration.GetConnectionString("AcmeWidgetsDb"); // 传入连接字符串注册类库的DbContext builder.Services.AddAppSecurityDbContext(acmeDbConn);
这样AppSecurityDataContext就能使用宿主项目的连接字符串,完全解耦配置依赖。
二、EF Core 6迁移时获取连接字符串
因为DbContext在类库中,迁移需要依赖宿主项目的配置,执行命令时必须指定启动项目为Acme.Widgets:
方式1:Package Manager Console(PMC)
- 打开PMC,将默认项目设置为
Framework.AppSecurity - 执行迁移命令:
# 添加迁移 Add-Migration AddSecurityTables -StartupProject Acme.Widgets # 更新数据库 Update-Database -StartupProject Acme.Widgets
方式2:.NET CLI
在终端中执行:
# 添加迁移 dotnet ef migrations add AddSecurityTables --project Framework.AppSecurity --startup-project Acme.Widgets # 更新数据库 dotnet ef database update --project Framework.AppSecurity --startup-project Acme.Widgets
执行时EF Core会加载Acme.Widgets的appsettings.json,自动读取对应的连接字符串完成迁移操作。
内容的提问来源于stack exchange,提问作者CoderForHire
相关产品推荐
相关产品推荐

