ASP.NET Core 1.1アプリケーションを使用していて、構成ファイルから接続文字列を読み取ろうとしています。構成ファイル(appsettings.json)から読み取るデータベースコンテキストのASP.NETコア実行マイグレーション
public class ApplicationDbContext : DbContext, IDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext()
{
}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
public ApplicationDbContext Create(DbContextFactoryOptions options)
{
var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
string connString = "some hardcoded connection string";
builder.UseSqlServer(connString);
return new ApplicationDbContext(builder.Options);
}
}
マイグレーションを実行すると、(例えばdotnet ef database update
)正常に動作します:
私のデータベースコンテキストクラスには、次のようになります。
私はハードコードされた接続文字列を削除したい場合は、私は次のような問題直面しています:私はApplicationDbContext
にIConfiguration
を注入しようとした場合、移行は、私が見つけることができない何かを注入せずにNo parameterless constructor defined for this object.
- を構成ファイルから情報を読み取る方法
どうすればよいですか?
ありがとうございました。
[EDIT] Startup.cs
で
私は、接続文字列を設定していると、それは(ランタイム)が正しく動作します:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
//services.AddApplicationInsightsTelemetry(Configuration);
string connString = ConfigurationExtensions.GetConnectionString(Configuration, "DefaultConnection");
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connString));
services.AddMvc();
}
問題はdotnet migrations
は、データベースコンテキストにおけるパラメータなしのコンストラクタを必要とするように思われることですIDbContextFactory<>
を実装するには、設定を注入する方法がわかりません。
編集ApplicationDbContext
とIOptions <>を試した後、私は提案された解決策を試してみましたが、私はdotnet migration
は、デフォルトコンストラクタを呼び出しますので、それを動作させることはできません。
public class ApplicationDbContext : DbContext, IDbContextFactory<ApplicationDbContext>
{
private IOptions<DefaultConnectionValue> ConnOptions;
private string connectionString;
public ApplicationDbContext()
{
Console.WriteLine("Default constructor was called");
}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IOptions<DefaultConnectionValue> connOptions) : base(options)
{
ConnOptions = connOptions;
connectionString = connOptions.Value.Value;
Console.WriteLine($"Injected connection string = {connectionString}");
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
public ApplicationDbContext Create(DbContextFactoryOptions options)
{
var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
//string connString = ConfigurationExtensions.GetConnectionString(null, "DefaultConnection");
builder.UseSqlServer(connectionString);
return new ApplicationDbContext(builder.Options, ConnOptions);
}
をしかし、あなたはConfigureServicesに追加しました:services.AddDbContext(オプション=>options.UseSqlServer(Configuration.GetConnectionString( "DefaultConnection"))); https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro –
Alexan
@Alex - あなたの質問に答えるために質問を編集しました。 – Alexei