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




