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());
}
}
我有一个 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());
}
}