You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

ASP.NET Core:如何将配置中的连接字符串传入DbContext?

如何让EF Core上下文使用配置文件中的连接字符串替代硬编码?

看起来你已经离正确答案很近了!问题出在你使用上下文的方式上——你手动通过new ContactDBContext()创建实例,这直接绕开了ASP.NET Core的依赖注入容器,导致你在ConfigureServices里配置的连接字符串根本没被用到,上下文还是会走OnConfiguring方法里的硬编码逻辑。

下面是具体的解决步骤:

1. 通过依赖注入获取ContactDBContext,不要手动new

修改你的ContactService,把上下文通过构造函数注入进来,而不是自己创建实例:

public class ContactService : IContactService {
    // 用私有只读字段保存注入的上下文
    private readonly ContactDBContext _dbContext;

    // 构造函数注入ContactDBContext
    public ContactService(ContactDBContext dbContext) {
        _dbContext = dbContext;
    }

    public async Task<List<ContactModel>> GetContacts() {
        // 直接使用注入的上下文,不需要using块(DI容器会管理它的生命周期)
        var dbContacts = await _dbContext.Contacts.ToListAsync();
        // 这里写转换为ContactModel的逻辑...
    }
}

小提示:ASP.NET Core中AddDbContext默认注册的是Scoped生命周期,上下文会在每个请求结束时自动被释放,不需要你手动using处理。

2. (推荐)清理OnConfiguring中的硬编码逻辑

既然已经通过依赖注入配置了连接字符串,OnConfiguring里的硬编码就可以去掉了,避免后续混淆:

public partial class ContactDBContext : DbContext {
    public ContactDBContext(DbContextOptions<ContactDBContext> options) : base(options) { }
    public virtual DbSet<Contacts> Contacts { get; set; }

    // 可以保留这个方法,但去掉硬编码,或者直接删除
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
        // 如果没有通过DI配置上下文,可以在这里抛出提示,防止意外使用默认逻辑
        if (!optionsBuilder.IsConfigured) {
            throw new InvalidOperationException("请通过依赖注入配置ContactDBContext的连接字符串");
        }
    }
}

3. 确认配置文件中的连接字符串名称匹配

你用了Configuration.GetConnectionString(nameof(ContactDBContext)),这意味着你的appsettings.json里的连接字符串键必须是ContactDBContext,要确保配置正确:

{
  "ConnectionStrings": {
    "ContactDBContext": "Server=yourservername;Database=ContactDB;Trusted_Connection=True;"
  }
}

这样修改后,你的上下文就会正确使用配置文件中的连接字符串,而不是硬编码的版本了。

内容的提问来源于stack exchange,提问作者ZedZip

火山引擎 最新活动