C# ASP.NET核心:如何将连接字符串传递到DBContext?
有一个工作示例: 我想用配置中的字符串替换程序集中硬编码的连接字符串。在原始示例中:C# ASP.NET核心:如何将连接字符串传递到DBContext?,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,有一个工作示例: 我想用配置中的字符串替换程序集中硬编码的连接字符串。在原始示例中: public partial class ContactDBContext : DbContext { public ContactDBContext() { } public ContactDBContext(DbContextOptions<ContactDBContext> options) : base(options) {
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;");
}
}
}
公共部分类ContactDBContext:DbContext
{
公共ContactDBContext()
{
}
公共ContactDBContext(DbContextOptions选项)
:基本(选项)
{
}
公共虚拟数据库集联系人{get;set;}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
如果(!optionBuilder.IsConfigured)
{
//#保护潜在敏感信息的警告
//在连接字符串中,应该将其移出源代码。
//看http://go.microsoft.com/fwlink/?LinkId=723263 指导
//关于存储连接字符串。
optionsBuilder.UseSqlServer(“Server=yourservername;
数据库=ContactDB;可信连接=True;“”;
}
}
}
我添加了代码:
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddDbContext<ContactDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString(nameof(ContactDBContext))));//<------?
//...
}
public void配置服务(IServiceCollection服务)
{
//...
services.AddDbContext(options=>options.UseSqlServer(Configuration.GetConnectionString(nameof(ContactDBContext)));//因为您是手动创建上下文实例,所以启动时应用的配置不会被注入到上下文中,而是使用onconfigurang
方法
这就是为什么没有应用开始时的配置
重构上下文以删除默认构造函数和配置
public partial class ContactDBContext : DbContext {
public ContactDBContext(DbContextOptions<ContactDBContext> options)
: base(options) {
}
public virtual DbSet<Contacts> Contacts { get; set; }
}
}
公共部分类ContactDBContext:DbContext{
公共ContactDBContext(DbContextOptions选项)
:基本(选项){
}
公共虚拟数据库集联系人{get;set;}
}
}
接下来,确保将上下文注入到所需的依赖类中
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
//...
}
}
公共类ContactService:IContactService{
ContactDBContext数据库;
公共ContactService(ContactDBContext db){
this.db=db
}
公共异步任务GetContacts(){
var触点=分贝触点;
//…转换为模型
//...
}
}
现在,当容器解析要注入的上下文时,应该包括启动时应用的配置
Reference从onconfigurang
中删除代码,该代码将覆盖启动时设置的连接。您正在通过在onconfigurang
中设置连接字符串来覆盖连接字符串,因为这发生在ConfigureServices
之后,是否在配置中删除代码或删除函数?另外,由于您有一个默认构造函数,因此选项可能未传递到上下文,因此它将使用OnConfiguring
,因为在这种情况下未配置生成器选项。我做了两个测试:在OnConfiguring中删除代码,删除了功能,运行应用程序-同样的问题。
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
//...
}
}