.NET 5 Web API で接続文字列を設定するためのベスト プラクティスに関するガイダンスを期待しています。EF Core Power Tools を使用してデータベース モデルをリバース エンジニアリングしており、appsettings.json ファイルに接続文字列があります。Microsoft の DbContext 構成ドキュメントの手順を既存のセットアップに適用する方法を理解しようとしています。
プロジェクトのセットアップ (簡潔にするために省略) は、基本的に次のようになります。
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' メソッドをオーバーライドすることでプロバイダーを構成できます...」というエラーが発生します)。
Connection String
クラス内にプロパティを追加して(自動生成後)、次のようApplicationDbContext.cs
にConfigureServices内にプロパティを設定することで、これを回避しています。Startup.cs
ApplicationDbContext.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
これによりusing(var db = new ApplicationDbContext() { }
、アプリケーション全体で を使用できますが、この接続文字列の設定は、EF Core Power Tools でモデルを更新するたびに上書きされます。
従うべきより良い例はありますか、またはここでの最良のアプローチは何ですか? ありがとう!