코드 우선 Entity Framework 마이그레이션 코드 디버그


138

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

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

감사


표준 C # 코드 일뿐입니다. 물론, 중단 점을 설정할 수 있습니다 ...
marc_s

1
패키지 관리자 콘솔을 사용하고 있기 때문에 실제로 응용 프로그램이 실행되고 있지 않습니다.
Daniel

1
그런 다음 패키지 관리자 콘솔에서 업그레이드하지 말고 애플리케이션을 처음 연결할 때 데이터베이스가 마이그레이션되도록 마이그레이션 초기화 프로그램을 기본 초기화 프로그램으로 설정하십시오.
Wiktor Zychla 2016 년

마이그레이션 코드를 사용하여 데이터베이스를 업데이트하고 있는데 앱을 중지하고 다시 실행하여 초기화 프로그램을 실행할 수 없습니다.
Daniel

SQL을 사용하지 않는 이유는 업데이트 코드가 다소 복잡하기 때문에 SQL을 사용하여 구현하는 것은 거의 불가능합니다.
Daniel

답변:


255

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

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

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

그 후 InnerException을 볼 수 있습니다.

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


3
예, 패키지 관리자 콘솔을 통해 업데이트 데이터베이스를 실행하는 동안 작동합니다. 매우 편리합니다!
Tom Ferguson

11
이것을 Configuration.Seed 메서드의 맨 위에 추가했습니다. 코드를 디버깅 할 Visual Studio를 선택할 수있는 팝업이 발생합니다. 그러나 시스템을 선택할 때 시스템이 중단됩니다 (아마 관련이 없음).
Talon

3
이 코드를 어디에 넣을까요? 누구든지 도울 수 있다면! 감사.
Aritra B

4
구성 클래스의 생성자에서.
Casey

5
@Talon Go 커피를 마시고 돌아올 때까지 다른 Visual Studio 인스턴스가 나타납니다. :)
Corstian Boerman

11

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

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

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

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

Update-Database TargetMigration: ThePreviousMigrationName

8

내 대답은 약간 어리석지 만 어쨌든 여기에 간다. 나와 같은 경우 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. 응용 프로그램을 디버깅하고 오류를 수정 한 후 "해킹"을 제거하십시오.


5

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

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 인스턴스를 선택하십시오.


4

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

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


고마워 톰 ... 내가 얻을 수있는 가장 가까운 대답이었다. 더 나은 솔루션으로 아무도 대답하지 않으면 대답으로 표시합니다. :)
Daniel

또는 메시지를 반환하고 싶은 예외를 던지십시오.
David d C e Freitas

2

나는 다른 곳 에서 "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를 사용하여 수동으로 연결할 수 있으며 실제로 예상대로 코드를 단계별로 진행할 수 있습니다. 실제로 시도해야 할 것은 두 방법의 조합입니다 ...


어떤 프로세스에 연결하고 있습니까?
XDS

-1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.