WebSurfer's Home

トップ > Blog 1   |   Login
Filter by APML

PostgreSQL で EF6 DB First

by WebSurfer 22. July 2022 14:26

PostgreSQL の既存のデータベースから Visual Studio 2022 の ADO.NET Entity Data Model ウィザードで Entity Data Model (EDM) を作成し、ASP.MET MVC5 アプリで利用する話を書きます。ウィザードが期待通り働かず紆余曲折ありました。そのあたりを以下に詳しく書きましたので興味があれば読んでください。

PostgresSQL で EF6 DB First

ASP.NET Core + EF Core ではなく、.NET Framework ベースの ASP.NET MVC5 で Entity Framework 6 を利用する話ですので注意してください。(ちなみに、EF Core では ADO.NET Entity Data Model ウィザードは使えません)

環境は以下の通りで、すべてこの記事を書いた時点での最新版です。

  • PostgreSQL 14.4
  • Visual Studio Community 2022 17.2.6
  • Npgsql PostgreSQL Integration 4.1.12
  • Entityframework6.Npgsql 6.4.3
  • Npgsql 6.0.5
  • .NET Framework 4.8
  • ASP.NET MVC 5.2.7 (VS2022 のテンプレートで作成)

PosrgreSQL は先の記事「PostgreSQL をインストールしました」に書いた自分の Windows 10 PC にインストールしたものです。

Npgsql PostgreSQL Integration は Visual Studio の拡張機能で、その中に "Create an Entity Framework 6 model from an existing database" という機能があって、ADO.NET Entity Data Model ウィザードで EDM を作成するには必須のようです。バージョン 4.1.12 は Visual Studio 2022 用にリリースされたものだそうです。

Npgsql PostgreSQL Integration

Entityframework6.Npgsql 6.4.3 と Npgsql 6.0.5 は NuGet からインストールします。これをインストールしないとデータソースのメニューの中に PostgreSQL Database が表示されないようです。

NuGet パッケージ

試しにまず .NET Framework 4.8 のコンソールアプリで EDM を作成してみました。

Visual Studio 2022 でコンソールアプリプロジェクトを作成し Entityframework6.Npgsql 6.4.3 と Npgsql 6.0.5 をインストールします。

ソリューションエクスプローラーでプロジェクトを右クリックして[追加(D)]⇒[新しい項目(W)...]で表示される「新しい項目の追加」画面で[ADO.NET Entity Data Model]を選択してウィザードを起動します。

ADO.NET Entity Data Model

「モデルのコンテンツの選択」画面が表示されるので[データベースから EF Designer]を選択して[次へ(N) >]をクリックします。(注: [データベースから Code First]を選択するのは DB First としては正しくないです)

モデルのコンテンツの選択

「データ接続の選択」画面が表示されるので[新しい接続]ボタンをクリックします。

データ接続の選択

「接続の変更」画面が表示されるのでその[変更]ボタンをクリックすると、下のような「データソースの変更」画面が表示されるので PostgreSQL Database を選択して[OK]ボタンをクリックします。

データソースの変更

「接続のプロパティ」画面で接続する PostgreSQL のサーバー名、ポート、データベース名などを入力して[OK]ボタンをクリックします。

接続のプロパティ

「データベースオブジェクトと設定の選択」画面で使用するテーブル(この例では Movie テーブル)にチェックを入れ[完了]をクリックすれば EDM(.edmx などのファイル)が生成されます。

データベースオブジェクトと設定の選択

以上、コンソールアプリでは問題なく EDM を作成できることが確認できたので、Visual Studio 2022 のテンプレートで .NET Framework 4.8 の ASP.NET MVC 5.2.7 ソリューション/プロジェクトを認証なしで作成し、それに上記と同様な手順で EDM の追加をトライしてみました。

コンソールアプリの時と同様に楽勝・・・だと思っていたのですがダメでした。(涙)

Entity Data Model ウィザードの最初の画面で[データベースから EF Designer]を選択して[次へ(N) >]をクリックすると、なぜか「新しい項目の追加」メニューに戻ってしまいます。

いろいろ試したのですが何をどうしてもダメでした。原因不明で今のところ解決策を見つけることができていません。

やむを得ないので、同じソリューション内に別プロジェクトでクラスライブラリを追加し、上に書いたコンソールアプリの手順と同様にして EDM を作りました。その結果が以下の画像です。

クラスライブラリと EDM

ただし、この時もクラスライブラリに Entityframework6.Npgsql 6.4.3, Npgsql 6.0.5 をインストールしてから、続けて EDM を生成しようとすると上に書いたのと同様に「新しい項目の追加」メニューに戻ってしまうという問題が出ました。Visual Studio を一旦終了して再度立ち上げるとその問題は出なくなり EDM は作成できたのですが、どうしてなのかこれも原因不明です。

EDM が完成したらクラスライブラリを ASP.NET MVC5 プロジェクトで参照に追加し、クラスライブラリの App.config に生成された接続文字列を MVC アプリの web.congfig にコピーします。接続文字列のコピーは忘れないようにしてください。

ソリューションをリビルドしてから「新規スキャフォールディングアイテムの追加」操作で CRUD 用の Controller/View を自動的に一式生成できます。

新規スキャフォールディングアイテムの追加

その実行結果がこの記事の一番上の画像です。Index(一覧表示)だけでなく Create, Edit, Details, Delete も期待通りに動きます。

以上ですが、そのあともう一つ不可解な現象がありました。上の操作が完了した後なら ASP.NET MVC5 プロジェクトでも「Entity Data Model ウィザード」画面から先に進めるようになったということです。

Npgsql PostgreSQL Integration 4.1.12 は Visual Studio 2022 用に 6 月にリリースされたばかりということで、動作が不安定なのかもしれません。どうしても .NET Framework ベースでなければならないということでなければ、上に書いたような不可解な動きはない .NET 6.0 の ASP.NET Core MVC の方向に進むのがよさそうです。


さて、次はコードファーストです。これも予期してなかった問題がありました。続けてこの記事に書くと長くなりすぎるので別の記事に書くことにします。

Tags: , , , ,

MVC

About this blog

2010年5月にこのブログを立ち上げました。その後ブログ2を追加し、ここはプログラミング関係、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  December 2022  >>
MoTuWeThFrSaSu
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar