データベース ファースト Scaffold-DbContext で「ビルドに失敗しました」 質問する

データベース ファースト 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

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

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

さもないと...

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

[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 -Project 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;Connection Timeout=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://learn.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet

おすすめ記事