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以上のデータソースに適用できます。

前提条件

このガイドでは、以下が必要です:

ガイド

  1. アプリケーションの作成
    1. Visual Studio を開き、「Windows Forms App」プロジェクトを新規作成します。
    2. プロジェクト名を「WinFormsAppPostgreSQL」にします。これにより、このガイドからコードをコピー&ペーストした場合に名前空間が一致します。設定したら「次へ」をクリックします。
    3. 次のページで「.NET 8.0(長期サポート)」を選択し、「作成」をクリックします。
  2. Entity Framework のインストールと必要なアセンブリへの参照を追加
    1. NuGet パッケージマネージャーを使用して、以下のパッケージをプロジェクトに追加します:
      1. Microsoft.EntityFrameworkCore
      2. Microsoft.EntityFrameworkCore.Relational
      3. Microsoft.EntityFrameworkCore.Tools
    2. インストールディレクトリの lib -> net8.0 サブフォルダ(例:「C:\Program Files\CData\CData ADO.NET Provider for PostgreSQL 2024\」)にある System.Data.CData.PostgreSQL.dll への参照を追加します。
    3. インストールディレクトリの lib -> net8.0 -> EFCORE80 サブフォルダにある CData.EntityFrameworkCore.PostgreSQL.dll への参照を追加します。
    4. 付属のライセンスファイル(.lic)をプロジェクトに追加します。ソリューションエクスプローラーでプロジェクトを右クリックし、追加 -> 既存の項目 -> System.Data.CData.PostgreSQL.lic(インストールディレクトリの lib -> netstandard2.0 サブフォルダにあります)を選択します。最後に、ライセンスファイルを右クリックして、出力ディレクトリにコピー プロパティを 新しい場合はコピーする に設定します。
    5. プロジェクトをビルドして、EF Core を使用するためのセットアップを完了します。
  3. データモデルのリバースエンジニアリング(スキャフォールディング)

    スキャフォールディングはパッケージマネージャーコンソール(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 ドキュメント

  4. フォームにコントロールを追加

    フォームデザインを開き、サーバーエクスプローラーの左側にある「ツールボックス」から、DataGridView と ComboBox をフォームに追加します。

  5. データバインディング

    Lego Sets 用の ComboBox:

    1. 追加した ComboBox を選択し、プロパティを開きます。「DataSource」プロパティを選択し、右側のドロップダウンをクリックして下部に移動し、「新しいオブジェクトデータソースの追加...」を選択します。
    2. 「LegoInventory」と「LegoSet」を選択して、Lego Inventory と Lego Sets のオブジェクトデータソースを作成し、OK をクリックします。
    3. これで「DataSource」プロパティのドロップダウンに、先ほど作成したオブジェクトデータソースが含まれています。「その他のデータソース」を展開し、「プロジェクトデータソース」から LegoSet を選択します。

    Lego Inventories 用の DataGridView:

    1. 追加した DataGridView の右上隅にある小さなボタンを選択し、「データソースの選択」のドロップダウンを開き、「その他のデータソース」を展開し、「プロジェクトデータソース」から LegoInventory を選択します。

    注意: ここにデータソースの種類が表示されない場合は、テーブルクラスとコンテキストクラスがプロジェクトに追加され、ソリューションがビルドされていることを確認してください。

  6. 表示内容の設定
    1. 追加した ComboBox を選択し、プロパティを開きます。「DisplayMember」プロパティを選択して「SetNum」に設定します。次に、「ValueMember」プロパティを選択して「Id」に設定します。これらのプロパティを設定することで、各 Inventory の Set Number が表示されますが、Inventory が選択されたときに取得される値は Inventory ID になります。
    2. 追加した DataGridView の右上隅にある小さなボタンを選択し、「列の編集...」を選択します。
    3. デフォルトでは、DataGridView はテーブルのすべてのカラムに対してカラムを作成するため、ここで不要なカラムを削除できます。
  7. すべての Lego Sets を読み込む
    1. ファイルを右クリックして「コードの表示」を選択し、フォームのコードを開きます。
    2. セッション用の 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 でリストとして公開されます。
  8. Lego Sets の表示
    1. フォームのデザイナーで、Lego Sets 用の ComboBox を選択します。
    2. ComboBox のプロパティで、イベント(稲妻ボタン)を選択し、SelectedValueChanged イベントをダブルクリックします。これにより、Lego Set の選択が変更されるたびに発火するイベントのスタブがフォームのコードに作成されます。
    3. 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 として公開されます。
  9. アプリケーションの実行

    すべての設定が完了したら、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 連携アプリの構築を始めましょう!