.NET 5 在使用 EF Core Power Tools 时正确注入 DbContext 连接字符串
.NET 5 properly injecting DbContext connection string when using EF Core Power Tools
希望获得有关在 .NET 5 Web 中设置连接字符串的最佳实践的指导 API。我正在使用 EF Core Power Tools 对数据库模型进行逆向工程,并且我在 appsettings.json 文件中有一个连接字符串。试图弄清楚我应该如何将 Microsoft's DbContext configuration documentation 中的步骤应用到我现有的设置中。
项目设置(为简洁起见缩短)基本上如下所示:
appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "..."
}
}
Startup.cs
namespace API
{
public class Startup
{
public Startup(IConfiguration configuration)
{
var builder = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", false, true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
Globals.Configuration = Configuration;
}
}
}
ApplicationDbContext.cs(由 EF Core Power Tools 自动生成)
namespace API.Data
{
public partial class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
{
}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
...
}
}
ExampleController.cs
namespace API.Controllers
{
[ApiController]
[Route("example")]
public class ExampleController : ControllerBase
{
[HttpGet("test")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult<ApiResponse> GetExample()
{
using (var db = new ApplicationDbContext())
{
...
}
}
}
}
现在,单独的设置不起作用(示例控制器将导致“没有为此 DbContext 配置数据库提供程序。可以通过覆盖 'DbContext.OnConfiguring' 方法来配置提供程序...”错误).
我一直在解决这个问题,方法是在 ApplicationDbContext.cs
class 中添加一个 Connection String
属性(在它自动生成之后)并在其中设置 属性在 Startup.cs
中配置服务,如下所示:
ApplicationDbContext.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
这确实允许在整个应用程序中使用 using(var db = new ApplicationDbContext() { }
,但每次我使用 EF Core Power Tools 刷新模型时,此连接字符串设置都会被覆盖。
有没有更好的例子可以效仿,或者最好的方法是什么?谢谢!
首先,因为您已经将数据库连接配置为一个选项。所以不需要 ApplicationDbContext
的默认构造函数
public partial class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
这应该没问题,如果你想从启动时设置连接字符串
现在您已经在启动中注入了 ApplicationDbContext
,您可以轻松地将控制器用作依赖项注入,而不是创建新对象。因为创建新对象,您需要在该 AppDbContext 上设置连接字符串,这不是一个好方法!
[ApiController]
[Route("example")]
public class ExampleController : ControllerBase
{
private readonly ApplicationDbContext _applicationDbContext;
ExampleController (private ApplicationDbContext applicationDbContext) {
_applicationDbContext = applicationDbContext;
}
[HttpGet("test")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult<ApiResponse> GetExample()
{
//use db context
var something = _applicationDbContext;
}
}
希望获得有关在 .NET 5 Web 中设置连接字符串的最佳实践的指导 API。我正在使用 EF Core Power Tools 对数据库模型进行逆向工程,并且我在 appsettings.json 文件中有一个连接字符串。试图弄清楚我应该如何将 Microsoft's DbContext configuration documentation 中的步骤应用到我现有的设置中。
项目设置(为简洁起见缩短)基本上如下所示:
appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "..."
}
}
Startup.cs
namespace API
{
public class Startup
{
public Startup(IConfiguration configuration)
{
var builder = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", false, true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
Globals.Configuration = Configuration;
}
}
}
ApplicationDbContext.cs(由 EF Core Power Tools 自动生成)
namespace API.Data
{
public partial class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
{
}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
...
}
}
ExampleController.cs
namespace API.Controllers
{
[ApiController]
[Route("example")]
public class ExampleController : ControllerBase
{
[HttpGet("test")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult<ApiResponse> GetExample()
{
using (var db = new ApplicationDbContext())
{
...
}
}
}
}
现在,单独的设置不起作用(示例控制器将导致“没有为此 DbContext 配置数据库提供程序。可以通过覆盖 'DbContext.OnConfiguring' 方法来配置提供程序...”错误).
我一直在解决这个问题,方法是在 ApplicationDbContext.cs
class 中添加一个 Connection String
属性(在它自动生成之后)并在其中设置 属性在 Startup.cs
中配置服务,如下所示:
ApplicationDbContext.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
这确实允许在整个应用程序中使用 using(var db = new ApplicationDbContext() { }
,但每次我使用 EF Core Power Tools 刷新模型时,此连接字符串设置都会被覆盖。
有没有更好的例子可以效仿,或者最好的方法是什么?谢谢!
首先,因为您已经将数据库连接配置为一个选项。所以不需要 ApplicationDbContext
public partial class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
这应该没问题,如果你想从启动时设置连接字符串
现在您已经在启动中注入了 ApplicationDbContext
,您可以轻松地将控制器用作依赖项注入,而不是创建新对象。因为创建新对象,您需要在该 AppDbContext 上设置连接字符串,这不是一个好方法!
[ApiController]
[Route("example")]
public class ExampleController : ControllerBase
{
private readonly ApplicationDbContext _applicationDbContext;
ExampleController (private ApplicationDbContext applicationDbContext) {
_applicationDbContext = applicationDbContext;
}
[HttpGet("test")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult<ApiResponse> GetExample()
{
//use db context
var something = _applicationDbContext;
}
}