Entity Framework Core에서 마이그레이션을 만들 때 DbContext를 어떻게 구성합니까?

.net-core c# dbcontext dependency-injection entity-framework-core

문제

Entity Framework의 마이그레이션 명령을 사용할 때 종속성 삽입을 구성 / 부트 스트랩 할 수있는 방법이 있습니까?

Entity Framework Core는 DbContext 하위 클래스에 대한 종속성 주입을 지원합니다. 이 메커니즘에는 DbContext 외부의 데이터 액세스 구성이 허용됩니다.

예를 들어, 다음은 config.json 에서 검색된 연결 문자열을 사용하여 SQL 서버에 지속되도록 EF를 구성합니다.

ServiceCollection services = ...

var configuration = new Configuration().AddJsonFile( "config.json" );
services.AddEntityFramework( configuration )
    .AddSqlServer()
    .AddDbContext<BillingDbContext>( config => config.UseSqlServer() );

그러나 migrations 명령은이 코드를 실행하는 것을 모릅니다. 따라서 공급자 부족 또는 연결 문자열 부족으로 인해 Add-Migration 이 실패합니다.

마이그레이션은 재정 의하여 작동하도록 만들 수 있습니다 OnConfiguring 내에서 DbContext 공급자 및 구성 문자열을 지정하는 하위 클래스,하지만 서로 다른 구성이 다른 곳에서 원하는 될 때이 방법으로 가져옵니다. 궁극적으로 마이 그 레이션 명령과 코드를 모두 유지하는 것은 바람직하지 않게 복잡해집니다.

참고 : 내 DbContext 는이를 사용하는 진입 점과 다른 어셈블리에 있으며 내 솔루션에는 여러 개의 시작 프로젝트가 있습니다.

수락 된 답변

@bricelam 은이 기능이 Entity Framework 7에 아직 존재하지 않는다고 언급했기 때문에이 누락 된 기능은 GitHub 문제 aspnet / EntityFramework # 639에서 추적합니다

그 동안 내가 찾은 쉬운 해결 방법은 서브 클래 싱을 번거롭지 않게 전역 상태를 이용하는 것이 었습니다. 대개 내 첫 디자인 선택은 아니지만 지금은 잘 작동합니다.

MyDbContext에서 :

public static bool isMigration = true;

protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder )
{
    // TODO: This is messy, but needed for migrations.
    // See https://github.com/aspnet/EntityFramework/issues/639
    if ( isMigration )
    {
        optionsBuilder.UseSqlServer( "<Your Connection String Here>" );
    }
}

Startup.ConfigureServices() .

public static bool isMigration = true;

protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder )
{
    // TODO: This is messy, but needed for migrations.
    // See https://github.com/aspnet/EntityFramework/issues/639
    if ( isMigration )
    {
        optionsBuilder.UseSqlServer( "<Your Connection String Here>" );
    }
}

(구성 코드는 필자의 경우 실제로 Autofac 모듈에있다.)


인기 답변

IDbContextFactory<TContext>

공용 기본 생성자가없는 컨텍스트 형식에 대해 디자인 타임 서비스를 사용하려면이 인터페이스를 구현하십시오. 디자인 타임 서비스는 파생 된 컨텍스트와 동일한 어셈블리에있는이 인터페이스의 구현을 자동으로 검색합니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace MyProject
{
    public class BloggingContextFactory : IDbContextFactory<BloggingContext>
    {
        public BloggingContext Create()
        {
            var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
            optionsBuilder.UseSqlServer("connection_string");

            return new BloggingContext(optionsBuilder.Options);
        }
    }
}

자세한 정보 : https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

하드 코드 된 연결 문자열에 만족하지 않으면 기사를 살펴보십시오.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.