구성이있는 클래스 라이브러리의 Entity Framework 7 마이그레이션 스캐 폴딩

asp.net-core code-first-migrations dnx entity-framework-core visual-studio-2015

문제

ASP.NET 5 클래스 라이브러리에있는 EF7 모델에 마이그레이션을 추가하려고합니다. dnx . ef migration add mymigration 실행할 때 dnx . ef migration add mymigration 은 어떤 프로젝트를 실행하는지에 따라 다른 결과로 실패합니다.

DbContext 가 공유 프로젝트에 있고 ef 명령이 종속성에 신경 쓰지 않기 때문에 주 프로젝트의 폴더에서 DbContext 찾을 수 없습니다.

공유 프로젝트의 폴더에서 실행하면 startup.cs에 지정된 연결 문자열에 액세스 할 수 없습니다. 나는 같은 질문에서 수집 한 당신의 연결 문자열을 지정하면 공유 프로젝트에서 작업을 수행하는 OnConfiguring 의 방법 DbContext 하지만 난 정말 구성에서 별도의 코드를 유지하고 싶습니다.

프로젝트 및 컨텍스트를 지정하기위한 명령 행 옵션을 구현했다고 언급 한 EF7 저장소의 일부 문제 로그 를 보았지만 예제가 없으며 커밋 기록의 소스 코드를 보는 방법을 사용할 수 없다는 것을 알았습니다 .

수락 된 답변

여기 당신을 위해 일할 수있는 방법이 있습니다.

공유 프로젝트의 폴더에서 실행하면 startup.cs에 지정된 연결 문자열에 액세스 할 수 없습니다.

Startup.cs

귀하의 Startup.cs에서 하드 코딩보다는 Configuration 에 액세스하여 연결 문자열을 지정한다고 가정합니다. 또한 Startup.cs 파일의 생성자에서 몇 가지 소스에서 구성을 설정한다고 가정합니다. 즉, Startup.cs는 다음과 같이 보일 수 있습니다.

public class Startup
{
    public IConfiguration Config { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddUserSecrets()
            .AddEnvironmentVariables();

        Config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options =>
            {
                options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]);
            });
    }

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        var db = serviceProvider.GetRequiredService<MyDbContext>();
        db.Database.AsSqlServer().EnsureCreated();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

config.json

또한, 당신은 프로젝트의 루트에있는 config.json에 연결 문자열을 추가하고 있다고 가정합니다 (또는 사용자 비밀이나 환경 변수를 통해 추가한다고 가정합니다). config.json은 다음과 같이 보일 수 있습니다 :

public class Startup
{
    public IConfiguration Config { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddUserSecrets()
            .AddEnvironmentVariables();

        Config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options =>
            {
                options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]);
            });
    }

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        var db = serviceProvider.GetRequiredService<MyDbContext>();
        db.Database.AsSqlServer().EnsureCreated();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

그렇게하지 않으면 시도해 볼 가치가 있습니다.

DbContext의 OnConfiguring 메서드에서 연결 문자열을 지정하면 공유 프로젝트에서 작동하지만이 코드는 구성과 별도로 유지하려고합니다.

DbContext

위의 제 가정이 올 바르면 Startup 클래스에서 사용한 것과 같은 패턴을 사용하여 DbContext 의 연결 문자열에 액세스 할 수 있습니다. 즉, DbContext 생성자에서 IConfiguration 설정합니다. 그런 다음 OnConfiguring 에서 연결 문자열에 액세스합니다. 다음과 같이 보일 수 있습니다.

public class Startup
{
    public IConfiguration Config { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddUserSecrets()
            .AddEnvironmentVariables();

        Config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options =>
            {
                options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]);
            });
    }

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        var db = serviceProvider.GetRequiredService<MyDbContext>();
        db.Database.AsSqlServer().EnsureCreated();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

프로젝트 구조

물론 공유 프로젝트 폴더의 루트에도 config.json 파일이 있어야합니다. 따라서 프로젝트의 구조는 다음과 같습니다.

public class Startup
{
    public IConfiguration Config { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddUserSecrets()
            .AddEnvironmentVariables();

        Config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options =>
            {
                options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]);
            });
    }

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        var db = serviceProvider.GetRequiredService<MyDbContext>();
        db.Database.AsSqlServer().EnsureCreated();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

위의 두 config.json 파일에는 DbContext 대한 연결 문자열 설정이 포함되어 있습니다.

어떤 생각들

config.json 연결 문자열을 복제하는 것이 싫다면 환경 변수 나 사용자 비밀을 대신 사용할 수 있습니다.




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