我将 .NET 和 EF 项目从 5 升级到 8,并立即遇到了管理迁移的问题(我使用包管理器控制台)。
以前,我有以下 DbContext 类:
public class PortalDbContext : DbContext {
private readonly IConfiguration _config;
public PortalDbContext(
DbContextOptions<PortalDbContext> options,
IConfiguration config) : base(options) {
_config = config;
}
protected override void OnModelCreating(ModelBuilder modelBuilder) {
//... assorted entity defs
base.OnModelCreating(modelBuilder);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
if(!optionsBuilder.IsConfigured) {
optionsBuilder.UseSqlServer(_config.GetConnectionString("PortalDBConnection"));
}
}
}
升级到 8 后,我必须为 EF 添加一个默认的无参数构造函数才能管理迁移(添加、更新等),否则会抛出无法解析服务错误。
public PortalDbContext() {}
但是因为它没有使用带有配置参数的自定义构造函数,所以我无法在 OnConfiguring 调用中使用 GetConnection String。
我通过直接在 UseSqlServer 调用中输入连接字符串来克服它
if(!optionsBuilder.IsConfigured) {
optionsBuilder.UseSqlServer("server=xxxxx, etc.");
}
但我真的希望能够在 appsettings.json 文件中单独定义配置字符串,因为我经常交换到不同的数据库进行开发和测试。
有没有办法让 EF 在管理迁移时可以访问配置?
请注意,我使用包管理器控制台作为 CLI,并将默认项目设置为包含 DbContext 类的项目。
另外,我在启动时有以下内容,但在 PMC 控制台中管理迁移时没有使用:
services.AddDbContext<PortalDbContext>(options =>
options.UseSqlServer(_config.GetConnectionString("PortalDBConnection")));
当然,在我发布问题后,我立即找到了答案(感谢 Chat GPT)。需要在 OnConfiguring 调用中设置指向 appsettings.json 的配置:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
if(!optionsBuilder.IsConfigured) {
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
optionsBuilder.UseSqlServer(configuration.GetConnectionString("PortalDBConnection"));
}
}