データベースからクラスを生成しようとしています(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ファイルにありますが、私は手動で編集していません。
新しい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
プロジェクトを手動でビルドするCtrl + Shift + Bは、ビルドの失敗の原因となったエラーを取得するのに役立ちました。
私はこれが古いことを知っていますが、今日これを理解しようとしてしばらく費やしたので、これが誰かを助けることを願っています。
.Net Coreプロジェクトがありますが、ファイルを.Net Standardクラスライブラリに足場化したいです。パッケージマネージャーコンソールのDbContext-Scaffold
は機能しませんでしたが、通常のコマンドプロンプトのdotnet ef dbcontext scaffold
は機能しました。
クラスライブラリにこれらのパッケージをインストールする必要がありました。
ソリューションのスタートアッププロジェクトとして.Net Coreプロジェクトを設定する必要がありましたそして、そのプロジェクトにはクラスライブラリへの参照が必要でした。最後の部分は、私が長い間頭を悩ませ続けていたものでした。
最後に、コマンドプロンプトからクラスライブラリにcd'dし、これを実行しました。
dotnet ef dbcontext scaffold "<connection string>" Microsoft.EntityFrameworkCore.SqlServer -o <output folder> -s <relative path to my startup project>
私にとって問題は、ファイルのないソリューション内の新しい空のコンソールプロジェクトでセットアップしようとしていたため、scaffoldingはこのプロジェクトをスタートアッププロジェクトとして使用しようとし、Main
が見つからなかったということです。空のメインを持つ新しいファイルを追加して修正しました
完全なソリューションを構築し、失敗した場所を確認します。ビルドされなかったフォルダーにいくつかのNuGetプロジェクトが隠されていました。ソリューションの再構築中にのみ、問題が何であるかがわかりました。すべてを構築する必要があります。そうしないと、足場が失敗します。
VS2017 Preview 3を使用して、.NET Core 2(PREVIEW)にさまざまな問題がありましたが、最終的には上記で提案したアプローチを採用し、新しいソリューションを作成しました。
<TargetFramework>netcoreapp2.0</TargetFramework>
次に、Entity Frameworkを追加しました。
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />
それから;
ソリューションで複数のプロジェクトを使用する場合は、パッケージマネージャーでデフォルトのプロジェクトを確認してください。
プロジェクトが実行されていないことを確認してください。何らかの理由で、APIがバックグラウンドで実行されている間、このコマンドは機能しません。
プロジェクト(EF Coreがインストールされている)が正しくビルドされていることを確認した場合でも、この問題は引き続き発生しました。 「ビルドに失敗しました」で失敗しました。 -Verbsose
フラグを使用すると表示されるメッセージ。
私の場合、これをしなければなりませんでした:
-Project
を切り替えて、新しく作成された(およびEFコアでプロビジョニングされた)プロジェクトを指すようにします。私のスローアウェイソリューションにはプロジェクトが1つしかなかったので、最後のステップは適切な対策のためだけでした。このプロセス全体では、ソリューションのどこかにASP.NETコアプロジェクト(またはクラスライブラリではない.NET Coreプロジェクト)が必要であり、おそらくソリューションスタートアッププロジェクトとしても設定されているようです。
Entity-frameworkがbuild failed
を返す場合、ほとんどのプロジェクトで何らかのエラーが発生しています。
コマンドを実行しているプロジェクトがクリーンでエラーがない場合でも、そのソリューションの他のプロジェクトがbuild failed
応答を引き起こす可能性があります。
Solution
Default project
内のPackage Manager Console
ドロップダウンで選択されていることを確認してください私の場合、私のプロジェクトは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>
上記のおかげで、プロジェクトソリューションを再構築することでこれを解決しました。個人的に重要な注意事項は次のとおりです。
dotnet build
を実行するだけでは十分ではありませんでした(そうだと思いました)。dotnet build
コマンドを実行しようとしただけだと思います同様に混乱した他の人の助けになることを願っています!