c# - ASP.NET 核心 : How to pass connection string to DBContext?

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

有一个工作示例: 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)上下文时,现在应该包含在启动时应用的配置。

引用 Configuring a DbContext

关于c# - ASP.NET 核心 : How to pass connection string to DBContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56378793/

相关文章:

c# - 为什么要在 C# 中引入 TargetInvocationException?

c# - 为什么 C# 4.0 中的可选参数需要编译时常量?

c# - DbSet 和 ObservableCollection 之间的转换

c# - 如何将图像的一部分插入图片框?

c# - DbContext 尝试将非空字段保存为空

c# - 如何使用 JWK 为 ES256 alg 验证 JWT?

authentication - UseCookieAuthentication 和 UseIdentity 的区别?

javascript - Ajax 向 Controller 发送空字符串?

c# - ASP.NET 核心 2 : What could be the code behind a "many-to-one" relationship in this case?

entity-framework-core - 如何在 EF 7 alpha 中添加外键