使用しようとしているConfigurationDbContext
があります。 DbContextOptions
とConfigurationStoreOptions
という複数のパラメーターがあります。
この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());
}
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
を登録する必要はありませんが、特定の場合に必要になる可能性があります。
これは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")));
}
DbコンテキストのすべてのパラメーターをクラスAppDbContextParams
に配置し、ファクトリーを登録してappdbcontextのオブジェクトを作成できます。
services.AddScoped(sp =>
{
var currentUser = sp.GetService<IHttpContextAccessor>()?.HttpContext?.User?.Identity?.Name;
return new AppDbContextParams { GetCurrentUsernameCallback = () => currentUser ?? "n/a" };
});
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;
}
}
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")
を使用して単に読み取ることができることに注意してください。