【问题标题】:.NET 5 properly injecting DbContext connection string when using EF Core Power Tools.NET 5 在使用 EF Core Power Tools 时正确注入 DbContext 连接字符串
【发布时间】: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 刷新模型时,此连接字符串设置都会被覆盖。

有没有更好的例子可以效仿,或者这里最好的方法是什么?谢谢!

【问题讨论】:

    标签: c# entity-framework asp.net-core asp.net-core-webapi ef-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() 和别的什么?
    • 不需要,因为您已经在这里注入了服务,只需在控制器上注入并使用它 services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection") );
    猜你喜欢
    • 2019-08-19
    • 2019-06-21
    • 2022-10-07
    • 1970-01-01
    • 2016-12-17
    • 2021-11-18
    • 2013-06-04
    • 2018-05-28
    相关资源
    最近更新 更多