PostgreSQL ADO.NET 開発ガイド - Entity Framework Winform アプリ
この記事では、Entity Framework(EF)Core を使用して Windows Forms App を作成するガイドを提供します。CData ADO.NET Provider for PostgreSQL を使用して、Lego インベントリデータを含む PostgreSQL インスタンスから Lego Inventories を一覧表示し、選択した Lego Inventory に関連付けられた Inventory Parts を表示するフォームを作成します。
注意: この記事では PostgreSQL データを使用していますが、同じ手法は CData がサポートする270以上のデータソースに適用できます。
前提条件
このガイドでは、以下が必要です:
- Visual Studio 2022
- .NET 8.0
- CData ADO.NET Provider for PostgreSQL
- サンプル PostgreSQL データベース
ガイド
-
アプリケーションの作成
-
Visual Studio を開き、「Windows Forms App」プロジェクトを新規作成します。
-
プロジェクト名を「WinFormsAppPostgreSQL」にします。これにより、このガイドからコードをコピー&ペーストした場合に名前空間が一致します。設定したら「次へ」をクリックします。
-
次のページで「.NET 8.0(長期サポート)」を選択し、「作成」をクリックします。
-
Visual Studio を開き、「Windows Forms App」プロジェクトを新規作成します。
-
Entity Framework のインストールと必要なアセンブリへの参照を追加
-
NuGet パッケージマネージャーを使用して、以下のパッケージをプロジェクトに追加します:
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Relational
- Microsoft.EntityFrameworkCore.Tools
- インストールディレクトリの lib -> net8.0 サブフォルダ(例:「C:\Program Files\CData\CData ADO.NET Provider for PostgreSQL 2024\」)にある System.Data.CData.PostgreSQL.dll への参照を追加します。
- インストールディレクトリの lib -> net8.0 -> EFCORE80 サブフォルダにある CData.EntityFrameworkCore.PostgreSQL.dll への参照を追加します。
- 付属のライセンスファイル(.lic)をプロジェクトに追加します。ソリューションエクスプローラーでプロジェクトを右クリックし、追加 -> 既存の項目 -> System.Data.CData.PostgreSQL.lic(インストールディレクトリの lib -> netstandard2.0 サブフォルダにあります)を選択します。最後に、ライセンスファイルを右クリックして、出力ディレクトリにコピー プロパティを 新しい場合はコピーする に設定します。
-
プロジェクトをビルドして、EF Core を使用するためのセットアップを完了します。
-
NuGet パッケージマネージャーを使用して、以下のパッケージをプロジェクトに追加します:
-
データモデルのリバースエンジニアリング(スキャフォールディング)
スキャフォールディングはパッケージマネージャーコンソール(PMC)を使用して実行します。PMC を開き、以下のコマンドを使用してスキーマを Models フォルダにスキャフォールディングします。このコマンドは、利用可能なすべてのテーブル/ビューのクラスを自動的に構築します。また、DbContext を拡張し、データソース内のテーブルを表す DbSet プロパティを公開するコンテキストクラスも作成します:
Scaffold-DbContext "Authscheme=Password;Server=;Port= ;User= ;Password= ;Database= ; " CData.EntityFrameworkCore.PostgreSQL -Tables lego_sets, lego_inventories -OutputDir Models -Context PostgreSQLContext 注意: Tables プロパティを設定して、接続してモデル化するテーブルの数を制限しています。これにより、利用可能なすべてのテーブルとビューではなく、PostgreSQL 接続から Lego Set と Lego Inventory テーブルのみをモデル化します。また、生成された PostgreSQLContext.cs ファイルの接続プロパティに QueryPassthrough=false を追加してください。
CData PostgreSQL ADO.NET Provider の接続プロパティの詳細については、CData ドキュメントページをご覧ください:CData PostgreSQL ADO.NET Provider ドキュメント
-
フォームにコントロールを追加
フォームデザインを開き、サーバーエクスプローラーの左側にある「ツールボックス」から、DataGridView と ComboBox をフォームに追加します。
-
データバインディング
Lego Sets 用の ComboBox:
-
追加した ComboBox を選択し、プロパティを開きます。「DataSource」プロパティを選択し、右側のドロップダウンをクリックして下部に移動し、「新しいオブジェクトデータソースの追加...」を選択します。
- 「LegoInventory」と「LegoSet」を選択して、Lego Inventory と Lego Sets のオブジェクトデータソースを作成し、OK をクリックします。
-
これで「DataSource」プロパティのドロップダウンに、先ほど作成したオブジェクトデータソースが含まれています。「その他のデータソース」を展開し、「プロジェクトデータソース」から LegoSet を選択します。
Lego Inventories 用の DataGridView:
- 追加した DataGridView の右上隅にある小さなボタンを選択し、「データソースの選択」のドロップダウンを開き、「その他のデータソース」を展開し、「プロジェクトデータソース」から LegoInventory を選択します。
注意: ここにデータソースの種類が表示されない場合は、テーブルクラスとコンテキストクラスがプロジェクトに追加され、ソリューションがビルドされていることを確認してください。
-
追加した ComboBox を選択し、プロパティを開きます。「DataSource」プロパティを選択し、右側のドロップダウンをクリックして下部に移動し、「新しいオブジェクトデータソースの追加...」を選択します。
-
表示内容の設定
- 追加した ComboBox を選択し、プロパティを開きます。「DisplayMember」プロパティを選択して「SetNum」に設定します。次に、「ValueMember」プロパティを選択して「Id」に設定します。これらのプロパティを設定することで、各 Inventory の Set Number が表示されますが、Inventory が選択されたときに取得される値は Inventory ID になります。
- 追加した DataGridView の右上隅にある小さなボタンを選択し、「列の編集...」を選択します。
-
デフォルトでは、DataGridView はテーブルのすべてのカラムに対してカラムを作成するため、ここで不要なカラムを削除できます。
-
すべての Lego Sets を読み込む
-
ファイルを右クリックして「コードの表示」を選択し、フォームのコードを開きます。
-
セッション用の DbContext を保持するプライベートフィールドを追加し、OnLoad メソッドのオーバーライドを追加します。完全なコードは以下のようになります:
using Microsoft.EntityFrameworkCore; using WinFormsAppPostgreSQL.Models; namespace WinFormsAppPostgreSQL { public partial class Form1 : Form { private PostgreSQLContext? dbContext; public Form1() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.dbContext = new PostgreSQLContext(); this.dbContext.LegoInventories.Load(); this.legoInventoryBindingSource.DataSource = dbContext.LegoInventories.ToList(); } } }-
このコードは以下の処理を行います:
- ComboBox に表示される Lego sets を読み込むために使用される PostgreSQLContext のインスタンスを作成します。
- Load 拡張メソッドを使用して、PostgreSQL 接続からすべての Lego sets を DbContext に読み込みます。
- legoInventoryBindingSource.DataSource プロパティを、DbContext によって追跡されている Lego sets で初期化します。これは、LegoInventories DbSet プロパティで .ToList() を呼び出すことで行われます。ToList() により、このデータが ComboBox でリストとして公開されます。
-
ファイルを右クリックして「コードの表示」を選択し、フォームのコードを開きます。
-
Lego Sets の表示
- フォームのデザイナーで、Lego Sets 用の ComboBox を選択します。
-
ComboBox のプロパティで、イベント(稲妻ボタン)を選択し、SelectedValueChanged イベントをダブルクリックします。これにより、Lego Set の選択が変更されるたびに発火するイベントのスタブがフォームのコードに作成されます。
-
SelectionValueChanged イベントのコードを記述します:
private void comboBox1_SelectedValueChanged(object sender, EventArgs e) { string selectedSetNum = Convert.ToString(comboBox1.SelectedValue); this.dbContext = new PostgreSQLContext(); this.dbContext.LegoInventories .Where(x => x.SetNum == selectedSetNum) .Load(); this.legoInventoryBindingSource.DataSource = dbContext.LegoInventories.Local.ToBindingList(); }-
このコードは以下の処理を行います:
- 選択された値を InventoryId カラムのデータ型に合わせて int に変換します。
- DataGridView に表示される Lego inventories を読み込むために使用される PostgreSQLContext のインスタンスを作成します。
- Load 拡張メソッドを使用して、指定された Inventory の Lego sets を PostgreSQL 接続から DbContext に読み込みます。
- legosetBindingSource.DataSource プロパティを、DbContext によって追跡されている Lego sets で初期化します。これは、LegoSet DbSet プロパティで Local.ToBindingList() を呼び出すことで行われます。Local は、ローカルデータと表示データの同期を維持するためのイベントが接続された、追跡されている inventories のローカルビューへのアクセスを提供します。ToBindingList() により、このデータが Windows Forms データバインディングで理解される IBindingList として公開されます。
-
アプリケーションの実行
すべての設定が完了したら、PostgreSQL インスタンスから Lego Sets を一覧表示し、選択した Lego Set に関連付けられた Lego Inventory を表示するアプリケーションを実行できます。まずソリューションをビルドし、緑色の再生ボタンでアプリケーションを起動します。アプリケーションが開いたら、以下のように Lego Sets をクリックして、各 Lego Set に関連付けられた Lego Inventories を表示できます:
.NET アプリケーションでシームレスなデータ接続を実現
PostgreSQL データの可能性を最大限に引き出したいとお考えですか?CData PostgreSQL ADO.NET Provider を使えば、.NET アプリケーションと PostgreSQL データをシームレスに統合できます。CData ADO.NET Provider for PostgreSQL コミュニティライセンスでは、個人の .NET プロジェクトでデータにアクセスするための永久無料ライブラリを、使い慣れた SQL で利用できます。ライセンスをリクエストして、今すぐ PostgreSQL 連携アプリの構築を始めましょう!