ASP.NET Core:如何将连接字符串传递给DBContext?

时间:2019-05-30 12:57:30

标签: c# asp.net-core entity-framework-core

有一个工作示例: https://www.codeproject.com/Articles/3132485/CRUD-Operation-using-ASP-NET-CORE-2-2-and-React-Re

我想用config中的字符串替换汇编中的硬编码连接字符串。在原始示例中:

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上下文?

1 个答案:

答案 0 :(得分:1)

由于您是手动创建上下文的实例,因此启动时应用的配置不会注入到上下文中,而是使用OnConfiguring方法。

这就是为什么您的开始配置没有被应用的原因。

重构上下文以删除默认构造函数和OnConfiguring

public partial class ContactDBContext : DbContext {
    public ContactDBContext(DbContextOptions<ContactDBContext> options)
        : base(options) {
    }

    public virtual DbSet<Contacts> Contacts { 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

        //...
    }
}

现在,当容器解析注入上下文时,应该包括启动时应用的配置。

引用Configuring a DbContext