0

.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 でモデルを更新するたびに上書きされます。

従うべきより良い例はありますか、またはここでの最良のアプローチは何ですか? ありがとう!

4

1 に答える 1

0

まず第一に、オプションとして DB 接続を構成したためです。したがって、デフォルトのコンストラクターは必要ありません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; 
        }
    } 
于 2021-11-03T04:47:03.483 に答える