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