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

4
这是一个工作示例: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上下文?

3
请从 OnConfiguring 方法中删除覆盖启动时设置的连接的代码。 - Nkosi
由于在OnConfiguring中设置连接字符串会在ConfigureServices之后发生,因此您正在覆盖连接字符串。 - Heretic Monkey
啊,是删除代码还是完全删除OnConfiguring函数? - ZedZip
还有可能是因为您有一个默认构造函数,选项没有传递到上下文,因此它将使用 OnConfiguring,因为在这种情况下构建器选项未配置。 - Nkosi
让我们在聊天中继续这个讨论 - ZedZip
显示剩余4条评论
1个回答

4
由于您手动创建了上下文实例,因此在启动时应用的配置没有被注入到上下文中,而是使用了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

        //...
    }
}

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

参考 配置 DbContext


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接