[EntityFramework.Core] Migration 오류 대응

2020. 3. 19. 19:41Database

EntityFramework.Core 마이그레이션 중에 나타나는 주요 오류에 대한 해결방안을 정리하였습니다.

오류1: Project 'Default' is not found.

VisualStudio의 Package Manage Console에서 Migration 명령 실행 시 위의 문구가 출력될 경우가 있습니다. NuGet Package Manager가 선택된 프로젝트를 찾지 못한다는 의미로써, NuGet Package Manager의 버그로 보입니다.

문제 해결방안 여러가지가 있는데, 하나 하나 실행해보시고 문제가 해결되는지 확인해보세요.

  1. VisualStudio를 재시작하신 후 문제가 해결되는지 확인해보세요.
  2. 재시작 후에도 문제가 문제가 지속될 경우 관리자 모드로 VisualStudio를 실행하고 다시 시도해 보세요.
  3. 문제가 지속될 경우 Unload Project와 Reload Project를 순서대로 진행하시고, VisualStudio를 재시작 후 진행해보세요.
  4. Package Manager Console에서 update-package -reinstall을 실행해보세요.
  5. 문제가 지속될 경우, 다음 경로의 Nuget 폴더를 삭제하시고 VisualStudio를 재시작한 후 진행해보세요.
    - %APPDATA%\Nuget 폴더 삭제
    - %APPDATA%\..\Local\Nuget 폴더 삭제
  6. 그래도 해결되지 않을 경우 NuGet Package Manager 확장을 재설치하면 해결된다는 사례가 있습니다.
오류2: Your target project 'Test.Web' doesn't match your migrations assembly 'Test.Data'. Either change your target project or change your migrations assembly. Change your migrations assembly by using DbContextOptionsBuilder. E.g. options.UseSqlServer(connection, b => b.MigrationsAssembly("Test.Web")). By default, the migrations assembly is the assembly containing the DbContext. Change your target project to the migrations project by using the Package Manager Console's Default project drop-down list, or by executing "dotnet ef" from the directory containing the migrations project.

이 문제는 EntityFramework DbContext를 선언하는 프로젝트와 이를 사용하는 프로젝트가 다른 경우 발생합니다. 예를들어 아래와 같이 프로젝트가 구성되어 있을 경우 문제가 발생합니다.

Solution
  ├Project.Data  → EntityFramework DbContext를 정의하는 프로젝트
  └Project.Web   → EntityFramework DbContext를 사용하는 프로젝트

이 문제를 해결하려면 EntityFramework에 설정되어 있는 TargetAssembly와 MigrationAssembly 값을 일치시켜 주어야 합니다. TargetFrmawork는 현재 실행하고 있는 프로젝트의 Assembly명으로 설정되며, MigrationAssembly는 DbContext가 정의되어 있는 Assembly 이름으로 설정됩니다. 이 값을 일치시키려면 아래와 같이 Startup.cs 파일에서 MigrationsAssembly 메서드를 호출해주시면 됩니다.

services.AddDbContext<TestDb>(
    options => options.UseSqlServer(Configuration.GetConnectionString("TestDb"),
    sqlServerOptionsAction: sqlOptions =>
    {
        //MigrationAssembly 이름을 실행 중인 프로젝트의 Assembly명으로 설정해주세요
        sqlOptions.MigrationsAssembly("Project.Web");
    }));