Database First Scaffold-DbContext에서 "빌드 실패"


83

데이터베이스에서 클래스를 생성하려고합니다 (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 파일에 있습니다.


6
전체 솔루션을 다시 컴파일 할 때 오류 / 경고가 표시됩니까?
Ignas

@Ignas 그렇게했고, 예, 재 컴파일하기 전에는 존재하지 않았던 종속성 오류가 발생했습니다. 싸우려고하기보다는 해결책을 다시 만들었습니다. 그래도 이제 새로운 문제가 있습니다. 이 질문을 편집하는 것과는 반대로 조금 후에 (이 질문이 비슷한 경우) 새 질문을 만들어야한다고 생각합니다.
LightToTheEnd

문제는 EFC 도구를 선언하려면 project.json이 있어야한다는 것입니다. 올바른 프로젝트 유형으로 다시 작성하면 json이 생성 될 수 있습니다.
Webezine

1
저에게 효과가 있었던 것은 scaffold 명령을 실행하기 전에 전체 솔루션 (프로젝트뿐만 아니라)이 성공적으로 빌드되었는지 확인하는 것이 었습니다.
manish gupta

많은 관심을 받았기 때문에이 질문을 간단히 업데이트하고 싶었습니다. 이것은 현재 사용 가능한 것보다 훨씬 오래된 EF Core 빌드에 있었으며 다른 몇 가지 문제 이후 Core가 가질 때까지 우리가 사용했던 솔루션은 EF6였습니다. 정착하는 데 더 많은 시간이 필요합니다. EF6조차도 문제가 있었지만 훨씬 더 안정적으로 설정했습니다.
LightToTheEnd

답변:


158

가장 중요한 두 가지 팁 :

[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


또한 확인 Project.JSON 파일이 그들에 의견이 없습니다 확인
Simon_Weaver

별도의 파일에 DATAACCESS 논리를 선호하지만, 기본 프로젝트가 ASPNET 핵심 프로젝트가 될 필요가있는 경우 그리고 네 당신은 '클래스 라이브러리'프로젝트에 스캐 폴딩 수
Simon_Weaver

팁 : 패키지 관리자 콘솔에서 실행해야합니다. 나 비주얼 스튜디오 명령 프롬프트에서 실행 작동하지 않습니다
Simon_Weaver

1
예를 들어 엔티티 파일을 제거한 경우 어떻게합니까? 이 파일이 없기 때문에 스캐 폴드가 작동하지 않지만 빌드되지 않기 때문에 스캐 폴드는 작동하지 않습니다. 꽤 짜증나.
sofsntp

6
귀찮게도 전체 솔루션을 구축 할 수 있어야하는 것 같습니다. 나는 다른 프로젝트에서 오류가 있었지만 비계 프로젝트는 괜찮 았습니다. 해결책은 다른 프로젝트를 선택하고 "언로드"하는 것이 었습니다. 그런 다음 비계를하고 다시 장전하세요.
Sam

11

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

.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>

11

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


예, 솔루션을 컴파일하는 것도 도움이되었습니다.
Piero Alberto

받아 들여진 대답은 이미 몇 년 전에 말했듯이. "새 스캐 폴드 명령을 실행하기 전에 프로젝트가 완전히 빌드되는지 확인하십시오."
Gert Arnold

5

내 프로젝트 (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 프로젝트)가 필요한 것 같습니다.


2
이것은 아마도이 페이지에서 더 유용한 항목 중 하나 일 것입니다. -verbose 플래그는 스캐 폴드에서 잘못 될 수있는 많은 것들을 다루기 때문에 올바른 방향으로 밀어야합니다.
Regianni

5

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


4

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는 모든 수업을 넣은 디렉토리의 이름입니다.

4

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


3

나에게 문제는 파일이없는 솔루션 내부의 새로운 빈 콘솔 프로젝트에서 설정하려고했기 때문에 스캐 폴딩 이이 프로젝트를 시작 프로젝트로 사용하려고 시도했지만 찾을 수 없었습니다 Main. 메인이 비어있는 새 파일을 추가하여 수정했습니다.


3

솔루션에서 여러 프로젝트를 사용하는 경우 패키지 관리자에서 기본 프로젝트를 확인하십시오.


3

위의 덕분에 프로젝트 솔루션을 재 구축하여이 문제를 해결했습니다. 개인적으로 중요한 몇 가지주의 사항은 다음과 같습니다.

  1. 실행하는 dotnet build것만으로는 충분하지 않았습니다 (그렇다고 가정했습니다)!
  2. Visual Studio 메뉴에서 빌드> 솔루션 빌드 (Ctrl + Shift + B)
    • 나는 단순히 dotnet build하위 프로젝트 (myProject.data) 내 에서 명령 을 실행하려고했다고 생각합니다.
    • 상위 프로젝트 (myProject) 솔루션을 다시 빌드하는 것이 핵심이었습니다.

나는 그것이 똑같이 혼란 스러웠던 다른 사람에게 도움이되기를 바랍니다!


3

프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "프로젝트 언로드"를 통해 EF 프로젝트 만 실행하고 명령을 실행하여 문제를 해결했습니다.


2

entity-framework가을 반환 build failed하면 대부분의 프로젝트에 오류가있는 것입니다.

명령을 실행중인 프로젝트가 깨끗하고 오류가없는 경우에도 해당 솔루션의 다른 프로젝트로 인해 build failed응답 이 발생할 수 있습니다 .

해결책

  • 전체 솔루션을 다시 빌드하십시오. 아마도 솔루션 재 구축 프로세스에서 해당 오류를 발견 할 것입니다.
  • 명령을 실행할 프로젝트가 Default project내부 드롭 다운 에서 선택되어 있는지 확인하십시오.Package Manager Console
  • 명령을 다시 실행하십시오.

1

저에게는 프로젝트가 Visual Studio로 빌드되었지만 Scaffold-DbContext를 실행할 때 "Microsoft.AspNetCore.App"의 버전을 지정해야했습니다.

그래서 대신 :

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeFrameworkVersion>2.1.6</RuntimeFrameworkVersion>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App"/>
</ItemGroup>

나는 가지고 있어야했다 :

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.6" />
</ItemGroup>

1

빌드가 제대로 작동하는지 확인하십시오.
패키지 콘솔에서 scaffold 명령을 실행하면 명령이 작동합니다.

Scaffold-DbContext 'Data Source=TEST-XY010;Initial Catalog=TESTDB;Trusted_Connection=True' Microsoft.EntityFrameworkCore.SqlServer -Context HOPWAContext -OutputDir TESTModel -Force

1

내 서버를 중지 한 다음 다시 실행하여 문제를 해결했습니다.


0

이것은 오늘 나를 위해 작동하지 않았습니다. 그래서 명령 줄에서 dotnet scaffold 명령을 실행 해 보았는데 처음으로 작동했습니다. 나 한테 묻지마 !!


문제를 식별 할 수있는 스택 추적을 제공하는 --verbose 플래그를 발견하기 전에 다시 중단되었습니다. 이 플래그와 관계없이 오류가 출력되면 도움이 될 것입니다.
Regianni

-1

모든 패키지가 있는지 확인하고 ctrl + shift + b를 눌러 솔루션을 빌드하십시오. 그것은 나에게 작동합니다.


받아 들여진 대답은 이미 몇 년 전에 말했듯이. "새 스캐 폴드 명령을 실행하기 전에 프로젝트가 완전히 빌드되는지 확인하십시오."
Gert Arnold

-1
  1. 프로젝트가 실행되고 있지 않은지 확인
  2. 프로젝트가 컴파일되고 있는지 확인

그것은 나를 위해 일했습니다.

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