データベースの最初のScaffold-DbContextで「ビルドに失敗しました」


83

データベースからクラスを生成しようとしています(EntityFrameworkのデータベースファーストアプローチ)。

便宜上、私は多かれ少なかれこのチュートリアルに沿って歩いていますhttps//docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html

Visual Studio PackageManagerコンソールで次のコード行に相当するものを実行しているところです。

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 2016

@Ignasそうしました。そうです、再コンパイルする前には存在しなかった依存関係エラーが発生しました。それは存在すべきではありませんでした。それと戦うのではなく、私は解決策を作り直しました。しかし、私は今、新しい問題を抱えています。これを編集するのではなく、少ししてから新しい質問をする必要があると思います(これが似ている場合)。
lightToTheEnd 2016

あなたの問題は、EFCツールを宣言するためにproject.jsonが必要だということだと思います。正しいプロジェクトタイプで書き直してみてください。これにより、jsonが生成される可能性があります。
Webezine 2016

1
私にとって、それが機能したのは、scaffoldコマンドを発行する前に、ソリューション全体(プロジェクトだけでなく)が正常にビルドされることを確認することでした。
manish gupta 2018

多くの注目を集めたので、この質問を簡単に更新したいと思いました-これは現在利用可能なものよりもはるかに古いビルドのEF Coreであり、他のいくつかの問題の後、Coreが使用するまでの解決策はEF6でした落ち着くためのより多くの時間。EF6でさえ問題を引き起こしましたが、私たちはそれをはるかに確実にセットアップしました。
LightToTheEnd

回答:


158

2つの最も重要なヒント:

[1]-新しいscaffoldコマンドを実行する前に、プロジェクトが完全にビルドれていることを確認してください。

そうでなければ...

  • コードの行を書き始めます。
  • 必要なDB列がモデルにないことに気付くでしょう。
  • あなたはそれを足場にしようとするでしょう。
  • 20分後、ビルド(およびscaffoldコマンド)が失敗する理由は、文字通り半分のコード行があるためであることがわかります。おっと!

[2]-ソース管理にチェックインするか、コピーを作成します。

  • 何が変更されたかを簡単に確認できます。
  • 必要に応じてロールバックを許可します。

運が悪かったり、間違えたりすると、非常に厄介な「鶏が先か卵が先か」の問題が発生する可能性があります。


その他の問題:

複数のDLLがある場合は、間違ったプロジェクトを生成してないことを確認してください。「ビルドに失敗しました」というメッセージはさまざまな理由で発生する可能性がありますが、足場を組んでいるプロジェクトにEFCoreがインストールされていない場合が最も愚かです。

パッケージマネージャーコンソールにはDefault projectドロップダウンがあり、予想される変更がない場合は、おそらくここに新しいファイルが表示されます。

ドロップダウンを設定することを忘れないよりも良い解決策は-Project、scaffoldコマンドにスイッチを追加することです。

これは私が使用する完全なコマンドです:

EFコア2の場合

Scaffold-DbContext -Connection "Server =(local); Database = DefenderRRCart; Integrated Security = True; Trusted_Connection = True;" -プロバイダーMicrosoft.EntityFrameworkCore.SqlServer-OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

EFコア3の場合

dotnet efdbcontextscaffold "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からテーブルを削除する場合は、古いエンティティファイルを自分で削除する必要があります(エクスプローラーで日付で並べ替えて、古いエンティティファイルを削除するだけです)。


完全な足場のリファレンス:

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 2016

はい、別のファイルでデータアクセスロジックを使用したい場合は、「クラスライブラリ」プロジェクトに足場を組むことができますが、プライマリプロジェクトはaspnetコアプロジェクトである必要があります
Simon_Weaver 2016

ヒント:必ずパッケージマネージャーコンソールから実行してください。Visual Studioコマンドプロンプトから実行している私には機能しません
Simon_Weaver 2017年

1
たとえば、エンティティファイルを削除した場合はどうしますか?このファイルがないため、スキャフォールドは機能しませんが、ビルドされないため、スキャフォールドは機能しません。かなり迷惑です。
sofsntp 2018年

6
迷惑なことに、ソリューション全体を構築できる必要があるようです。他のプロジェクトでエラーが発生しましたが、足場へのプロジェクトは問題ありませんでした。解決策は、他のプロジェクトを選択して「アンロード」することでした。次に足場、次にリロードします。
サム

11

私はこれが古いことを知っていますが、今日これを理解しようとしばらく時間を費やしたので、これが誰かに役立つことを願っています。

.Net Coreプロジェクトがありますが、ファイルを.NetStandardクラスライブラリにスキャフォールディングしたいと思います。DbContext-Scaffoldパッケージマネージャーコンソールでは機能しませんでしたdotnet ef dbcontext scaffoldが、通常のコマンドプロンプトでは機能しました。

これらのパッケージをクラスライブラリにインストールする必要がありました。

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

ソリューションのスタートアッププロジェクトとして.NetCoreプロジェクトを設定する必要があり、そのプロジェクトにはクラスライブラリへの参照が必要でした。最後の部分は、私が長い間頭をかいていたのに欠けていたものだと思います。

最後に、コマンドプロンプトからクラスライブラリにCDを挿入し、次のコマンドを実行しました。

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

11

Ctrl + Shift + Bを押してプロジェクトを手動でビルドすると、ビルドが失敗する原因となったエラーを確認するのに役立ちました。


ええ、ソリューションをコンパイルすることも私を助けました。
ピエロアルベルト

受け入れられた答えがすでに何年も前に言ったように。「新しいscaffoldコマンドを実行する前に、プロジェクトが完全にビルドされていることを確認してください。」
GertArnold20年

5

プロジェクト(EF Coreがインストールされている)が正しくビルドされていることを確認しても、この問題は引き続き発生しました。それでも「ビルドに失敗しました」で失敗しました。メッセージ-Verbsose。フラグを使用すると表示されます。

私の場合、これをしなければなりませんでした:

  • 使い捨てのASP.NETCoreWebアプリケーションソリューションを作成する
  • EF CoreNuGetパッケージをソリューションに追加します
  • EF Core Sql ServerプロバイダーのNuGetパッケージを追加します(SqlServerを使用しているため)
  • EFコアツールのNuGetパッケージを追加します
  • -Projectパッケージマネージャーのコンソールコマンドを切り替えて、新しく作成した(およびEFコアでプロビジョニングされた)プロジェクトをポイントします。私の使い捨てソリューションにはプロジェクトが1つしかなかったので、最後のステップはちょうどいい測定でした。

このプロセス全体では、ソリューションのどこかにASP.NETコアプロジェクト(またはクラスライブラリではない.NET Coreプロジェクト)が必要であるようです。おそらく、ソリューションのスタートアッププロジェクトとしても設定されています。


2
これはおそらく、このページで最も役立つエントリの1つです。-verboseフラグは、scaffoldで問題が発生する可能性のある多数の問題をカバーするため、正しい方向にプッシュする必要があります。
Regianni

5

プロジェクトが実行されていないことを確認してください。何らかの理由で、APIがバックグラウンドで実行されている間はこのコマンドが機能しません。


4

VS2017 Preview 3、.NET Core 2(PREVIEW)を使用すると、さまざまな問題が発生しましたが、最終的には上記のアプローチを採用し、まったく新しいソリューションを作成しました。

  1. 新しい.NETCoreソリューションを作成しました
  2. プロジェクトファイルを編集し、1.0から2.0に変更しました。 <TargetFramework>netcoreapp2.0</TargetFramework>
  3. 閉じた/再び開いたソリューション

次に、EntityFrameworkを追加しました。

  1. PackageManagerコンソールの場合:
    • インストールパッケージMicrosoft.EntityFrameworkCore.SqlServer-バージョン2.0.0-preview2-final
    • インストールパッケージMicrosoft.EntityFrameworkCore.Tools-Version 2.0.0-preview2-final
    • インストールパッケージMicrosoft.EntityFrameworkCore.Design-Version 2.0.0-preview2-final
  2. プロジェクトファイルを編集し、追加しました: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

次に;

  1. Powershellコマンドプロンプトを開き、ディレクトリをScaffoldプロジェクトフォルダーに変更しました
  2. 実行:dotnet efdbcontextスキャフォールド "Server = DESKTOP-MB70B7U; Database = ForexForme; Trusted_Connection = True" Microsoft.EntityFrameworkCore.SqlServer-oモデル
    • あなたがあなた自身の接続文字列を入れるところ!
    • Modelsは、すべてのクラスを配置するディレクトリの名前です。

4

完全なソリューションを構築し、どこで失敗するかを確認します。ビルドされなかったフォルダーにいくつかのNuGetプロジェクトが隠されていました。ソリューションを再構築している間だけ、私は問題が何であるかを知りました。すべてを構築する必要があります。そうしないと、Scaffoldは失敗します。


3

私にとっての問題は、ファイルがないソリューション内の新しい空白のコンソールプロジェクトでセットアップしようとしたため、scaffoldがこのプロジェクトをスタートアッププロジェクトとして使用しようとしましたが、見つかりません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

これは今日私のために働くのをやめました。そこで、コマンドラインからdotnetscaffoldコマンドを実行してみましたが初めて動作しました。私に聞かないで!


--verboseフラグを発見する前に再び壊れました。これにより、問題を特定できるスタックトレースが提供されました。このフラグに関係なくエラーが出力された場合は、おそらく役立つでしょう。
Regianni

-1

すべてのパッケージがあることを確認し、ctrl + shift + bを押してソリューションをビルドします。それは私にはうまくいきます。


受け入れられた答えがすでに何年も前に言ったように。「新しいscaffoldコマンドを実行する前に、プロジェクトが完全にビルドされていることを確認してください。」
GertArnold20年

-1
  1. プロジェクトが実行されていないことを確認してください
  2. プロジェクトがコンパイルされていることを確認してください

それは私のために働いた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.