[entity-framework] 코드 우선 Entity Framework 마이그레이션 코드 디버그

내 웹 사이트에서 먼저 Entity Framework 코드를 사용하고 있으며 마이그레이션 코드를 디버깅하는 방법이 있는지 궁금합니다. 중단 점 설정과 같은 것을 알고 있습니다.

패키지 관리자 콘솔을 사용하여를 사용하여 데이터베이스를 업데이트하고 있습니다 Update-Database.

감사



답변

EF Code First Migrations는 비교적 새로운 도구이지만 여전히 .NET에 있다는 것을 잊지 마십시오.

따라서 다음을 사용할 수 있습니다.

if (System.Diagnostics.Debugger.IsAttached == false)
{
    System.Diagnostics.Debugger.Launch();
}

그 후 InnerException을 볼 수 있습니다.

또는 다음과 같이 try … catch 문을 사용할 수 있습니다.
Exception handling Entity Framework


답변

DB 마이그레이션에서 중단 점에 도달하려면 초기화시 컨텍스트를 MigrateDatabaseToLatestVersion으로 설정하십시오.

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());

그런 다음 정상적으로 디버그 (f5를 사용하여 실행)하면 프로젝트를 처음 실행할 때 중단 점이 발생합니다.

이제 문제는 두 번째 디버깅을 수행하면 마이그레이션이 실행되지 않는다는 것입니다. __MigrationHistory 테이블이 최신 버전으로 마이그레이션되었다고 업데이트 되었기 때문 입니다. 마이그레이션을 다시 테스트하려면 패키지 관리자 콘솔을 열고 이전 마이그레이션으로 다운 그레이드하십시오.

Update-Database TargetMigration: ThePreviousMigrationName


답변

내 대답은 약간 어리석지 만 어쨌든 여기에 간다. 나와 같은 경우 Seed () 메서드에 문제가있는 경우 일반적으로 Protect Seed ()를 호출하는 공용 메서드를 만드는 것입니다.

public void SeedDebug(AppDbContext context)
{
    Seed(context);
}

그런 다음 내 HomeController 에서이 메소드를 디버그 모드에서 호출합니다.

public class HomeController : Controller
{
    var appDb = new AppDbContext();
    public ActionResult Index()
    {
        var config = new Configuration();
        config.SeedDebug(appDb);
        return View();
    }
}

나는 그것이 약간 절름발이 해결책이라는 것을 알고 있지만 간단하고 빠릅니다. 물론 이것은 모델을 만든 후에 수행해야합니다. 따라서 단계별로 :

  1. seed 메소드에 주석을 달고 update-database를 실행하여 모델을 작성하십시오.
  2. Seed () 메소드의 주석을 해제하고 위에서 언급 한 “hack”을 플러그인하십시오.

  3. 구성에서 자동 마이그레이션 사용 안함

    AutomaticMigrationsEnabled = false; //이 기능을 비활성화 한 경우이 단계를 건너 뜁니다

  4. 응용 프로그램을 디버깅하고 오류를 수정 한 후 “해킹”을 제거하십시오.


답변

많은 번거 로움없이 트릭을 수행하는 더 확실한 방법이 있습니다.

1 단계 : 디버깅하려는 마이그레이션 바로 위에이 코드를 배치하십시오.

public partial class ORACLE_Test : DbMigration
{
    public override void Up()
    {
        if (!System.Diagnostics.Debugger.IsAttached)
            System.Diagnostics.Debugger.Launch();

        AddColumn("TEST", "UR_USER_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
        AddColumn("TEST", "UR_CLIENT_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
        [...]
    }

    public override void Down()
    {
    }
}

2 단계 : 마이그레이션이 포함 된 프로젝트 컴파일

3 단계 : 마이그레이션 dll이 포함 된 출력 디렉토리 (/ bin / Debug, / bin / Release 등)에서 콘솔을 엽니 다.

4 단계 : / scriptFile 매개 변수와 함께 migrate.exe를 호출하여 디버거를 시작하고 실제로 원하는 db-migration을 디버깅

migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"

디버거 선택기 대화 상자가 나타나면 이미 연 Visual Studio 인스턴스를 선택하십시오.


답변

Console.WriteLine 문을 마이그레이션 코드에 추가 할 수 있습니다 (좋은 해결책은 아닙니다)

migrate.exe유틸리티 (in pacakges\EntityFramework.x.y.z\tools)를 사용하여 마이그레이션 코드를 실행하는 경우에만 메시지가 표시됩니다 . 패키지 관리자 콘솔을 통해 마이그레이션을 실행하면 표시되지 않습니다.


답변

나는 다른 곳 에서 “Debugger.Launch ()”( 위의 m_david의 답변 과 같은)를 사용하여 많은 행운을 얻었 지만 CreateDbContext 내부에서는 어떻게 든 첨부하고 첨부하지 않는 것처럼 보입니다. 내 말은 .asm 파일과 .cpp 파일 (내부 코드)에 연결하려고 시도하고 시작한다는 것입니다. 콘솔에서 중단 점을 설정하려고하면 나중에 알고있는 줄을 씁니다 (모든 “dotnet ef migrations COMMAND”의 출력을 볼 수 있음) 둘 다 실행하고 중단 점에 도달하지 않습니다.

이것이 대신 나를 위해 일한 것입니다.

while (!System.Diagnostics.Debugger.IsAttached)
    System.Threading.Thread.Sleep(10);

// Breakpoint after this...

마이그레이션을 실행하고 Visual Studio를 사용하여 수동으로 연결할 수 있으며 실제로 예상대로 코드를 단계별로 진행할 수 있습니다. 실제로 시도해야 할 것은 두 방법의 조합입니다 …


답변

나는 또한 깔끔한 트릭을 발견 여기에 오류 정보를 얻을 수 …

기본적으로 트릭은 예외에서 모든 정보를 가져 와서 문자열에 넣고 생성 된 문자열과 원래 예외를 사용하여 새 DbEntityValidationException을 발생시키는 것입니다.