[c#] Database First Scaffold-DbContext에서 “빌드 실패”

데이터베이스에서 클래스를 생성하려고합니다 (EntityFramework의 데이터베이스 첫 번째 접근 방식).

편의를 위해 https://docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html 튜토리얼을 따라 가고 있습니다.

저는 Visual Studio 패키지 관리자 콘솔에서이 코드 줄에 해당하는 코드를 실행하는 시점에 있습니다.

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -Verbose

이 코드 줄은 오류를 생성합니다 (-Verbose 모드 사용).

Using startup project 'EFSandbox'.
Using project 'EntityFrameworkCore'
Build started...
Build failed.

의미있는 출력을 생성하는 다른 옵션이없고이 특정 오류에 대한 문서도 표시되지 않습니다. 도움이된다면 현재이 프로젝트에는 project.json 파일이 없습니다. 모든 것이 수동으로 편집하지 않은 .csproj 파일에 있습니다.



답변

가장 중요한 두 가지 팁 :

[1]- 새 스캐 폴드 명령을 실행하기 전에 프로젝트가 완전히 빌드되었는지 확인하십시오 .

그렇지 않으면…

  • 코드를 작성하기 시작합니다.
  • 모델에서 필수 DB 열이 누락되었음을 알 수 있습니다.
  • 당신은 그것을 비계하려고 할 것입니다.
  • 20 분 후에 빌드 (및 스캐 폴드 명령)가 실패한 이유는 말 그대로 반 줄의 코드가 있기 때문입니다. 이런!

[2]-소스 제어에 체크인하거나 사본을 만드십시오.

  • 변경된 사항을 쉽게 확인할 수 있습니다.
  • 필요한 경우 롤백을 허용합니다.

운이 나지 않거나 실수를하면 매우 성가신 ‘닭과 달걀’문제가 발생할 수 있습니다.


기타 문제 :

DLL이 여러 개있는 경우 잘못된 프로젝트 로 생성하고 있지 않은지 확인하십시오 . ‘빌드 실패’메시지는 여러 가지 이유로 발생할 수 있지만 스캐 폴딩 대상 프로젝트에 EFCore가 설치되어 있지 않은 경우 가장 멍청한 것입니다.

패키지 관리자 콘솔에는 Default project드롭 다운이 있으며 예상되는 변경 사항을 놓친 경우 새 파일이 끝날 수 있습니다.

드롭 다운 설정을 기억하는 것보다 더 나은 솔루션은 -Project스캐 폴딩 명령에 스위치를 추가하는 것 입니다.

이것은 내가 사용하는 전체 명령입니다.

EF Core 2의 경우

Scaffold-DbContext -Connection “Server = (local); Database = DefenderRRCart; Integrated Security = True; Trusted_Connection = True;” -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext-프로젝트 RR.DataAccess -force

EF Core 3의 경우

dotnet ef dbcontext scaffold “Server = tcp : XXXXX.database.windows.net, 1433; Initial Catalog = DATABASE_NAME; Persist Security Info = False; User ID = USERNAME; Password = PASSWORD; MultipleActiveResultSets = False; Encrypt = True; TrustServerCertificate = False ; 연결 시간 초과 = 30; ” Microsoft.EntityFrameworkCore.SqlServer -o DB.Models –context-dir DB.Contexts –context RRDBContext –project RR.EF.csproj –force –use-database-names

참고 : -force는 파일을 덮어 쓰지만 더 이상 존재하지 않는 파일은 제거하지 않습니다. DB에서 테이블을 삭제하는 경우 이전 항목 파일을 직접 삭제해야합니다 (Explorer에서 날짜별로 정렬하고 이전 항목을 삭제하면됩니다).


전체 비계 참조 :

EF 핵심 2 :

https://docs.efproject.net/en/latest/miscellaneous/cli/powershell.html#scaffold-dbcontext (이

EF 핵심 3 :

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet


답변

나는 이것이 오래되었다는 것을 알고 있지만 오늘 이것을 알아 내려고 노력하면서 시간을 보냈으므로 이것이 누군가에게 도움이되기를 바랍니다.

.Net Core 프로젝트가 있지만 내 파일을 .Net Standard 클래스 라이브러리로 스캐 폴딩하고 싶습니다. DbContext-Scaffold패키지 관리자 콘솔에서는 작동하지 않았지만 dotnet ef dbcontext scaffold일반 명령 프롬프트 에서는 작동했습니다 .

내 클래스 라이브러리에 이러한 패키지를 설치해야했습니다.

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools

.Net Core 프로젝트를 솔루션의 시작 프로젝트로 설정 해야했고 해당 프로젝트에는 클래스 라이브러리에 대한 참조가 있어야했습니다 . 나는 마지막 부분이 내가 너무 오랫동안 머리를 긁적 거리게했던 내가 놓친 부분이라고 생각한다.

마지막으로 명령 프롬프트에서 클래스 라이브러리로 cd’d하고 다음을 실행했습니다.

dotnet ef dbcontext scaffold "<connection string>" Microsoft.EntityFrameworkCore.SqlServer -o <output folder> -s <relative path to my startup project>


답변

Ctrl + Shift + B 를 눌러 수동으로 프로젝트를 빌드하면 빌드 실패의 원인이되는 오류를 확인할 수있었습니다.


답변

내 프로젝트 (EF Core가 설치되어 있음)가 올바르게 빌드되었는지 확인한 경우에도 여전히이 문제가 발생했습니다. “빌드 실패”로 여전히 실패했습니다. 메시지는 -Verbsose플래그를 사용할 때 표시됩니다 .

제 경우에는 이렇게해야했습니다.

  • 일회용 ASP.NET Core 웹 애플리케이션 솔루션 만들기
  • 솔루션에 EF Core NuGet 패키지 추가
  • EF Core Sql Server 공급자 NuGet 패키지 추가 (SqlServer를 사용하고 있기 때문에)
  • EF Core Tools NuGet 패키지 추가
  • -Project새로 생성 된 (및 EF Core 프로비저닝 된) 프로젝트를 가리 키도록 패키지 관리자 콘솔 명령으로 전환 합니다. 내 일회용 솔루션에는 프로젝트가 하나만 있었기 때문에 마지막 단계는 좋은 측정이었습니다.

이 전체 프로세스에는 솔루션 어딘가에 솔루션 시작 프로젝트로 설정된 ASP.NET 코어 프로젝트 (또는 클래스 라이브러리가 아닌 .NET Core 프로젝트)가 필요한 것 같습니다.


답변

프로젝트가 실행되고 있지 않은지 확인하세요. 어떤 이유로 내 API가 백그라운드에서 실행되는 동안에는이 명령이 작동하지 않습니다.


답변

VS2017 Preview 3, .NET Core 2 (PREVIEW)를 사용하여 모든 종류의 문제가 있었지만 결국 위에서 제안한 접근 방식을 취하여 새로운 솔루션을 만들었습니다.

  1. 새로운 .NET Core 솔루션 생성
  2. 프로젝트 파일을 편집하고 1.0을 2.0으로 변경했습니다.
    <TargetFramework>netcoreapp2.0</TargetFramework>
  3. 폐쇄 / 재개 솔루션

그런 다음 Entity Framework를 추가했습니다.

  1. PackageManager 콘솔에서 :
    • 설치 패키지 Microsoft.EntityFrameworkCore.SqlServer-버전 2.0.0-preview2-final
    • 설치 패키지 Microsoft.EntityFrameworkCore.Tools-버전 2.0.0-preview2-final
    • 설치 패키지 Microsoft.EntityFrameworkCore.Design-버전 2.0.0-preview2-final
  2. 프로젝트 파일 편집 및 추가 :
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

그때;

  1. Powershell 명령 프롬프트를 열고 디렉터리를 Scaffold 프로젝트 폴더로 변경했습니다.
  2. Ran : dotnet ef dbcontext scaffold “Server = DESKTOP-MB70B7U; Database = ForexForme; Trusted_Connection = True”Microsoft.EntityFrameworkCore.SqlServer -o 모델
    • 자신의 연결 문자열을 넣는 곳!
    • Models는 모든 수업을 넣은 디렉토리의 이름입니다.


답변

완전한 솔루션을 구축하고 실패한 부분을 확인하십시오. 빌드하지 않은 폴더에 일부 NuGet 프로젝트가 숨겨져 있습니다. 솔루션을 재 구축하는 동안에 만 문제가 무엇인지 알아 냈습니다. 빌드에 필요한 모든 것이 그렇지 않으면 Scaffold가 실패합니다.