web-dev-qa-db-ja.com

ASP.NET Core DbContextインジェクション

使用しようとしているConfigurationDbContextがあります。 DbContextOptionsConfigurationStoreOptionsという複数のパラメーターがあります。

このDbContextをASP.NET Coreのサービスに追加するにはどうすればよいですか?

Startup.csで次のことを試みました。

ConfigureServices
....
services.AddDbContext<ConfigurationDbContext>(BuildDbContext(connString));
....


private ConfigurationDbContext BuildDbContext(string connString)
{
    var builder = new DbContextOptionsBuilder<ConfigurationDbContext>();
    builder.UseSqlServer(connString);

    var options = builder.Options;

    return new ConfigurationDbContext(options, new ConfigurationStoreOptions());
}
8
blgrnboy

AddDbContext実装 は、コンテキスト自体とその共通の依存関係をDIに登録するだけです。 AddDbContext呼び出しの代わりに、DbContextを手動で登録することは完全に合法です:

services.AddTransient<FooContext>();

さらに、ファクトリーメソッドを使用してパラメーターを渡すこともできます(これは質問に答えています)。

services.AddTransient<FooContext>(provider =>
{
    //resolve another classes from DI
    var anyOtherClass = provider.GetService<AnyOtherClass>();

    //pass any parameters
    return new FooContext(foo, bar);
});

追記:一般に、DbContext自体を解決するためにDbContextOptionsFactoryとデフォルトのDbContextOptionsを登録する必要はありませんが、特定の場合に必要になる可能性があります。

9
Ilya Chumakov

これはstartup.csで使用できます。

詳細情報: https://docs.Microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

詳細な例: ASP.NET Core MVCおよびEntity Framework Coreの使用開始

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>options.
       UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
3
hasan

DbコンテキストのすべてのパラメーターをクラスAppDbContextParamsに配置し、ファクトリーを登録してappdbcontextのオブジェクトを作成できます。

services.AddScoped(sp =>
            {
                var currentUser = sp.GetService<IHttpContextAccessor>()?.HttpContext?.User?.Identity?.Name;
                return new AppDbContextParams { GetCurrentUsernameCallback = () => currentUser ?? "n/a" };
            });
0
FindOutIslamNow

Efコンテキストを注入するためにこれを試してください-IDbContextからのコンテキスト継承

1-サービスにコンテキストを追加します。

        public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<NopaDbContext>(
                        options => options
                        .UseLazyLoadingProxies()
                        .UseSqlServer(Configuration.GetConnectionString("NopaDbContext")),ServiceLifetime.Scoped);}

2-コンテキストを挿入します。

    private readonly IDbContext _context;

    public EfRepository(NopaDbContext context)
    {
        this._context = context;
    }

    protected virtual DbSet<TEntity> Entities
    {
        get
        {
            if (_entities == null)
                _entities = _context.Set<TEntity>();

            return _entities;
        }
    }
0

DbContextのサービスとしてIServiceCollectionを登録するには、2つのオプションがあります(SQL Serverデータベースに接続することを想定しています)。

AddDbContext <>を使用して

services.AddDbContext<YourDbContext>(o=>o.UseSqlServer(Your Connection String));

AddDbContextPool <>を使用する

services.AddDbContextPool<YourDbContext>(o=>o.UseSqlServer(Your Connection String));

ご存知のように、これらの2つは記述に関しては類似点がありますが、実際には概念に関していくつかの根本的な違いがあります。 @GabrielLuciには、これら2つの違いについて素晴らしい回答があります。 https://stackoverflow.com/a/48444206/16668

また、接続文字列をappsettings.jsonファイル内に保存し、Startup.csファイルのConfigureServicesメソッド内でConfiguration.GetConnectionString("DefaultConnection")を使用して単に読み取ることができることに注意してください。

0