Entity Framework Core and ASP.NET Core Web API connection string : 如何删除两个地方的连接字符串?

Entity Framework Core and ASP.NET Core Web API connection string : how to remove the connection string in two places?

我有一个 ASP.NET Core Web API 项目引用了一个 EF Core 项目。

当我构建 EF Core 项目时,它会自动在 OnConfiguring 方法中设置连接字符串:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        optionsBuilder.UseSqlServer("Server=etc;Database=etc;uid;pwd;");
    }
}
    

然后我发现将连接字符串放在web.config中相当于将它放在Web API项目的appSettings.json文件中,然后读取它Web API 项目的 Startup class 的 ConfigureServices 方法等...

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddSwaggerGen(c => ...);

    var CNN_STR = Configuration.GetConnectionString("DBNameInAppSettingsJson");
    services.AddDbContext<MyDBContext>(options =>
        options.UseSqlServer(CNN_STR));
}

但是现在连接字符串在两个地方!我应该从 EF Core 项目的 OnConfiguring() 方法中删除它吗?如果可以,怎么做?

更好的方法是通过在 Startup.cs.

中使用 ConfigureServices 来使用依赖注入(搜索该术语)

然后,将已配置的 DbContext 注入到您需要的位置(您将在文档中看到更多相关信息),而不是在需要时手动实例化 DbContext。

https://docs.microsoft.com/en-us/ef/core/dbcontext-configuration/

关于 IsConfigured 仍然是错误的评论,这可能是因为您在某处手动实例化 DbContext,而不是注入它(依赖注入)。如果注入它,您将从 ConfigureServices 获得配置的版本。如果您手动实例化它,您将获得一个未配置的版本。

如果您想在控制器中配置 DbContext 版本,请使用以下内容:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddSwaggerGen(c => ...);

    var CNN_STR = Configuration.GetConnectionString("DBNameInAppSettingsJson");
    services.AddDbContext<MyDBContext>(options =>
        options.UseSqlServer(CNN_STR));
}

控制器

public class MyController : ControllerBase
{
    private readonly MyDbContext _Context;
    
    public MyController(
        MyDbContext context)
    {
        // The parameter 'context' is provided by ASP Dependency Injection
        // ... It will be the configured version from above startup.cs
        _Context = context;
    }

    public async Task DoSomething()
    {
        // Use the configured context
        await _Context.Widgets.AddAsync(new Widget());
    }
}