データベースからクラスを生成しようとしています (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