Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心:如何将连接字符串传递到DBContext?_C#_Asp.net Core_Entity Framework Core - Fatal编程技术网

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

        //...
    }
}