有一个工作示例: https://www.codeproject.com/Articles/3132485/CRUD-Operation-using-ASP-NET-CORE-2-2-and-React-Re
我想用配置中的字符串替换程序集中的硬编码连接字符串。它在原始示例中:
public partial class ContactDBContext : DbContext
{
public ContactDBContext()
{
}
public ContactDBContext(DbContextOptions<ContactDBContext> options)
: base(options)
{
}
public virtual DbSet<Contacts> Contacts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
//#warning To protect potentially sensitive information
//in your connection string, you should move it out of source code.
//See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance
//on storing connection strings.
optionsBuilder.UseSqlServer("Server=yourservername ;
Database=ContactDB;Trusted_Connection=True;");
}
}
}
我已经添加了代码:
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddDbContext<ContactDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString(nameof(ContactDBContext))));//<------?
//...
}
字符串读取正常,但未使用。仍然使用硬编码字符串(参见第一段代码)。
我使用这样的上下文
public class ContactService : IContactService
{
public async Task<List<ContactModel>> GetContacts()
{
using (ContactDBContext db = new ContactDBContext())
{
//...
如何将连接字符串从应用程序传递到 EF 上下文?
最佳答案
因为您是手动创建上下文的实例,所以启动时应用的配置不会注入(inject)到上下文中,而是使用 OnConfiguring
方法。
这就是为什么您在开始时的配置没有被应用的原因。
重构上下文以移除默认构造函数和OnConfiguring
public partial class ContactDBContext : DbContext {
public ContactDBContext(DbContextOptions<ContactDBContext> options)
: base(options) {
}
public virtual DbSet<Contacts> Contacts { get; set; }
}
}
接下来确保将上下文注入(inject)到所需的依赖类中
public class ContactService : IContactService {
ContactDBContext db;
public ContactService (ContactDBContext db) {
this.db = db
}
public async Task<List<ContactModel>> GetContacts() {
var contacts = db.Contacts;
//...convert to models
//...
}
}
当容器解析注入(inject)上下文时,现在应该包含在启动时应用的配置。
关于c# - ASP.NET 核心 : How to pass connection string to DBContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56378793/