0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita全国学生対抗戦Advent Calendar 2024

Day 12

Add-Migrationのスタートアッププロジェクトをクラスライブラリにするとエラーになる

Last updated at Posted at 2024-12-23

はじめに

今まではWindowsフォームアプリのプロジェクトにDbContextとエンティティ、Migrationフォルダを置いていたのですが、別のプロジェクトでも使うしクラスライブラリプロジェクトを作ってそっちに置いた方がいいのかな?と思って移動しました。
Add-Migrationしました。
エラーが出ました。
なんでやorz

環境

・VisualStudio 2022 Comunnity 17.12.3
・Windowsフォームアプリ(.NET8.0)
・Windowsフォームクラスライブラリ

原因分析

エラーメッセージはこんな感じです:

パッケージマネージャーコンソール
Unable to create a 'DbContext' of type 'MyContext'. 
The exception 'Object reference not set to an instance of an object.' was thrown while attempting to create an instance. 
For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

-Verboseでログを詳しく見てみると、

パッケージマネージャーコンソール
Finding application service provider in assembly 'POSレジライブラリ'... 
Finding Microsoft.Extensions.Hosting service provider... 
No static method 'CreateHostBuilder(string[])' was found on class 'Program'. 
No application service provider was found. 

こんな風にあります。
EFCoreはAdd-MigrationするときにCreateHostBuilderメソッドを呼び出すらしいのですが、それがなかったみたいです。
なら、winformsのプロジェクトで動いたのはなんでだろう?と思って-Verboseで見てみました。

パッケージマネージャーコンソール
Microsoft.EntityFrameworkCore.Design.Internal.AppServiceProviderFactory.CreateFromHosting(String[] args) An error occurred while accessing the Microsoft.Extensions.Hosting services. 
Continuing without the application service provider. 
Error: The entry point exited without ever building an IHost. 
No application service provider was found.
Using context 'MyContext'. 
Finding design-time services referenced by assembly 'POSレジ会計'... 

こちらもアプリケーションサービスプロバイダーを探している途中にエラーが発生していますが、そのまま次のステップに進んでいます。
GitHub Copilotに聞いてみると、CreateHostBuilderメソッドはASP.NETのホスティング環境を構築するのに使われるのに対して、winformsはデスクトップで作動するためCreateHostBuliderメソッドは適していない、とのことらしいです。
そして、winformsではApplication.Runでフォームを起動する、と言っていました。
あまりよくわかっていませんが、ASP.NETではProgramクラスのCreateHostBuilderメソッドを呼ぶ必要があるがwinformsではエントリーポイントから起動できるよ、みたいな感じでしょうか。

解決策

どうしてもクラスライブラリプロジェクトをスタートアッププロジェクトにしたいのであれば、ProgramクラスとCreateHostBuilderメソッドを追加すれば出来そうです。
私の場合はクラスライブラリにする必要性は薄かったのでwinformsプロジェクトをスタートアッププロジェクトにしました。

参考リンク

追記(2024.12.26)

やっぱりモデルクラスはクラスライブラリプロジェクトにあったほうが便利だなーと思ってCreateHostBuliderメソッドを書かないままAdd-Migrationを試したらなんか行けました。なんで…?
相変わらずこの文は出てたんですが、winformsプロジェクトでやった時と同じようにそのまま進んでました。

パッケージマネージャーコンソール
No static method 'CreateHostBuilder(string[])' was found on class 'Program'.
No application service provider was found.
Using context 'MyContext'.
Finding design-time services referenced by assembly 'POSレジライブラリ'...
Finding design-time services referenced by assembly 'POSレジライブラリ'...
No referenced design-time services were found.
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?