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.
- 실패합니다 :
내가 하드 코드 된 연결 문자열을 제거하려면
, 나는 다음과 같은 문제에 직면하고있다 구성 파일에서 정보를 읽는 방법
어떻게 진행해야합니까?
감사합니다.
[편집] 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