내 웹 사이트에서 먼저 Entity Framework 코드를 사용하고 있으며 마이그레이션 코드를 디버깅하는 방법이 있는지 궁금합니다. 중단 점 설정과 같은 것을 알고 있습니다.
패키지 관리자 콘솔을 사용하여를 사용하여 데이터베이스를 업데이트하고 있습니다 Update-Database
.
감사
내 웹 사이트에서 먼저 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();
}
}
나는 그것이 약간 절름발이 해결책이라는 것을 알고 있지만 간단하고 빠릅니다. 물론 이것은 모델을 만든 후에 수행해야합니다. 따라서 단계별로 :
Seed () 메소드의 주석을 해제하고 위에서 언급 한 "hack"을 플러그인하십시오.
구성에서 자동 마이그레이션 사용 안함
AutomaticMigrationsEnabled = false; //이 기능을 비활성화 한 경우이 단계를 건너 뜁니다
응용 프로그램을 디버깅하고 오류를 수정 한 후 "해킹"을 제거하십시오.
많은 번거 로움없이 트릭을 수행하는 더 확실한 방법이 있습니다.
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를 사용하여 수동으로 연결할 수 있으며 실제로 예상대로 코드를 단계별로 진행할 수 있습니다. 실제로 시도해야 할 것은 두 방법의 조합입니다 ...