.NET 5 在使用 EF Core Power Tools 时正确注入 DbContext 连接字符串
Posted
技术标签:
【中文标题】.NET 5 在使用 EF Core Power Tools 时正确注入 DbContext 连接字符串【英文标题】:.NET 5 properly injecting DbContext connection string when using EF Core Power Tools 【发布时间】:2021-12-17 12:42:09 【问题描述】:希望获得有关在 .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
类中添加一个 Connection String
属性(在它自动生成之后)并在 Startup.cs
内的 ConfigureServices 中设置该属性,如下所示:
ApplicationDbContext.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
这确实允许在整个应用程序中使用 using(var db = new ApplicationDbContext()
,但是每次我使用 EF Core Power Tools 刷新模型时,此连接字符串设置都会被覆盖。
有没有更好的例子可以效仿,或者这里最好的方法是什么?谢谢!
【问题讨论】:
【参考方案1】:首先,您已将 DB Connection 配置为选项。所以不需要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;
【讨论】:
语法在构造函数上只是关闭了一点点(建议的编辑队列说明你的答案已经满了),但这显然有效!以为我试过这个,但一定忽略了一些东西。比在每个对象上设置它要好得多。谢谢,阿西夫! 这很容易在控制器中应用,但是在控制器外部的类中使用来自 DI 的 DbContext 需要哪些额外步骤? services.AddScoped以上是关于.NET 5 在使用 EF Core Power Tools 时正确注入 DbContext 连接字符串的主要内容,如果未能解决你的问题,请参考以下文章
EF Core 中的 ASP.NET Core 5 MVC 和 Identity - 基于资源的授权
带有 EF Core 和 CosmosDB .NET 5 的 ASP.Net Core - IdentityRole 问题
基于Asp.net core + EF + Sqlite 5分钟快速上手一个小项目
EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体