web-dev-qa-db-ja.com

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ファイルにありますが、私は手動で編集していません。

51
LightToTheEnd

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

私によく起こることは、コードの行を書き始め、新しいDBカラムが必要であることを認識し、それをスキャフォールドしようとすることです-そして、20分後にビルド(およびスキャフォールドコマンド)が失敗する理由を実感しますコードの半分の行が書かれています。おっと。


複数のDLLがある場合、間違ったプロジェクトに生成される可能性があります。その後、さまざまな理由で「Build failed」が発生します。おそらく、そのプロジェクトにEFCoreがインストールされていない可能性があります。

パッケージマネージャーコンソールにはDefault projectがあり、おそらくそこがファイルの終わりです。

解決策は簡単で、オプションに-Projectスイッチを追加するだけです。

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

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

注:-forceはファイルを上書きしますが、もう存在しないファイルは削除しません。 DBからテーブルを削除する場合は、古いエンティティファイルを自分で削除する必要があります(Explorerで日付でソートし、古いものを削除するだけです)。

完全なオプション: https://docs.efproject.net/en/latest/miscellaneous/cli/powershell.html#scaffold-dbcontext

98
Simon_Weaver

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

5
Mxaza

私はこれが古いことを知っていますが、今日これを理解しようとしてしばらく費やしたので、これが誰かを助けることを願っています。

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

私にとって問題は、ファイルのないソリューション内の新しい空のコンソールプロジェクトでセットアップしようとしていたため、scaffoldingはこのプロジェクトをスタートアッププロジェクトとして使用しようとし、Mainが見つからなかったということです。空のメインを持つ新しいファイルを追加して修正しました

3
Austin_Anderson

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

3
Guido Neele

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 -Version 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. Ran:dotnet ef dbcontext scaffold "Server = DESKTOP-MB70B7U; Database = ForexForme; Trusted_Connection = True" Microsoft.EntityFrameworkCore.SqlServer -o Models
    • 独自の接続文字列を配置する場所!
    • Modelsは、すべてのクラスを配置するディレクトリの名前です
3
James Joyce

ソリューションで複数のプロジェクトを使用する場合は、パッケージマネージャーでデフォルトのプロジェクトを確認してください。

2
Muhammet Bozkan

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

2
Josh Siegl

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

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

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

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

2
bcr

Entity-frameworkがbuild failedを返す場合、ほとんどのプロジェクトで何らかのエラーが発生しています。

コマンドを実行しているプロジェクトがクリーンでエラーがない場合でも、そのソリューションの他のプロジェクトがbuild failed応答を引き起こす可能性があります。

Solution

  • ソリューション全体を再構築します。ほとんどの場合、ソリューションの再構築プロセスでそのエラーが見つかります。
  • コマンドを実行するプロジェクトがDefault project内のPackage Manager Consoleドロップダウンで選択されていることを確認してください
  • コマンドを再実行してください。
1
Inam Ul Huq

私の場合、私のプロジェクトはVisual Studioでビルドされましたが、Scafold-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
Cpt.Ohlund

上記のおかげで、プロジェクトソリューションを再構築することでこれを解決しました。個人的に重要な注意事項は次のとおりです。

  1. dotnet buildを実行するだけでは十分ではありませんでした(そうだと思いました)。
  2. Visual Studioメニューで、ビルド>ソリューションのビルド(Ctrl + Shift + B)
    • 子プロジェクト(myProject.data)内でdotnet buildコマンドを実行しようとしただけだと思います
    • 親プロジェクト(myProject)ソリューションの再構築が重要でした

同様に混乱した他の人の助けになることを願っています!

1
Joel Balmer