ADO.NET 開発者ガイド - Entity Framework Windows Forms アプリ
この記事では、Entity Framework(EF)Core を使用して Windows Forms アプリを作成する方法をご紹介します。CData ADO.NET Provider for CSV を活用し、CSV ファイルから Account の一覧を表示し、選択した Account に関連する Opportunity を別の CSV ファイルから取得して表示するアプリケーションを作成していきます。
注意:この記事では CSV ファイルを例として使用していますが、ここで紹介する原則は CData がサポートする 270 以上のデータソースすべてに適用できます。
前提条件
このガイドでは、以下が必要です。
- Visual Studio 2022
- .NET 8.0
- CData ADO.NET Provider for CSV
- サンプル CSV ファイル(ZIP ダウンロード)
ガイド
-
アプリケーションの作成
-
Visual Studio を開き、新規プロジェクトとして「Windows Forms App」を作成します。
-
プロジェクト名を「WinFormsAppCSV」に設定します。こうすることで、このガイドのコードをコピー&ペーストした際に名前空間が一致します。設定後、「次へ」を選択します。
-
次の画面で「.NET 8.0 (長期サポート)」を選択し、「作成」をクリックします。
-
Visual Studio を開き、新規プロジェクトとして「Windows Forms App」を作成します。
-
Entity Framework のインストールと必要なアセンブリへの参照の追加
-
NuGet パッケージマネージャーを使用して、以下のパッケージをプロジェクトに追加します。
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Relational
- Microsoft.EntityFrameworkCore.Tools
- インストールディレクトリ内の lib -> net8.0 サブフォルダにある System.Data.CData.CSV.dll への参照を追加します。
- インストールディレクトリ内の lib -> net8.0 -> EFCORE80 サブフォルダにある CData.EntityFrameworkCore.CSV.dll への参照を追加します。
-
プロジェクトをビルドして、EF Core を使用するためのセットアップを完了します。
-
NuGet パッケージマネージャーを使用して、以下のパッケージをプロジェクトに追加します。
-
CSV ファイル(Account.csv と Opportunity.csv)をプロジェクトに追加
- ソリューションエクスプローラーでプロジェクトを右クリックし、「追加」>「新しいフォルダー」を選択します。
- フォルダ名を「CSVFiles」とし、作成したフォルダを右クリックして「追加」>「既存の項目...」を選択します。
- Account.csv と Opportunity.csv ファイルを CSVFiles フォルダに追加します。
-
リバースエンジニアリング(スキャフォールディング)によるデータモデルの生成
スキャフォールディングはパッケージマネージャーコンソール(PMC)を使用して実行します。PMC を開き、以下のコマンドを使用してスキーマからすべてのテーブルとビューを Models フォルダにスキャフォールディングします。このコマンドは、利用可能なテーブル/ビューのクラスを自動的に構築します。また、DbContext を拡張し、データソース内のテーブルを表す DbSet プロパティを公開するコンテキストクラスも作成されます。
Scaffold-DbContext "URI=YourURI; RowScanDepth=0;UseRowNumbers=True" CData.EntityFrameworkCore.CSV -OutputDir Models -Context CSVContext-
注意:
- 「URI」接続プロパティには、CSV ファイルが格納されているフォルダのパスを設定します。例:「C:\Users\YourUser\source\repos\WinFormsAppCSV\WinFormsAppCSV\CSVFiles\Account.csv」
- 「RowScanDepth」プロパティを「0」に設定することで、CSV ファイルの表形式表現のカラム名とデータ型を動的に決定するために、CSV ファイル全体をスキャンします。ドキュメント全体をスキャンするとリクエスト時間が長くなる場合がありますが、データモデルを反映する際のカラムのデータ型がより正確になります。
- CSV ファイルには主キーがないため、UseRowNumbers を「True」に設定します。これにより、「RowNumber」という名前の新しいカラムが作成され、テーブルのキーとして使用されます。Entity Framework はデータ操作を管理するために主キーに依存しており、主キーのないテーブル/ビューは生成されたモデルから除外されます。
CData CSV ADO.NET Provider の接続プロパティの詳細については、CData ドキュメントページをご覧ください:CData ADO.NET Provider for CSV ドキュメント
-
フォームへのコントロールの追加
フォームデザイナーを開き、サーバーエクスプローラー左側の「ツールボックス」から DataGridView と ComboBox をフォームに追加します。
-
データバインディング
Account CSV ファイルから個々のアカウントを選択するための ComboBox:
-
追加した ComboBox を選択してプロパティを開きます。「DataSource」プロパティを選択し、右側のドロップダウンをクリックして、下部にある「新しいオブジェクト データ ソースの追加...」を選択します。
-
「AccountCsv」を選択して Account 用のオブジェクトデータソースを作成し、OK をクリックします。
-
これで「DataSource」プロパティのドロップダウンに、作成したオブジェクトデータソースが表示されます。「その他のデータ ソース」を展開し、「プロジェクト データ ソース」から AccountCsv を選択します。
選択したアカウントに関連する Opportunity を表示するための DataGridView:
-
追加した DataGridView の右上隅にある小さなボタンを選択し、「データ ソースの選択」のドロップダウンを開いて、「新しいオブジェクト データ ソースの追加...」を選択します。
-
「OpportunityCsv」を選択して Opportunity 用のオブジェクトデータソースを作成し、OK をクリックします。
-
これで「データ ソースの選択」のドロップダウンに、作成したオブジェクトデータソースが表示されます。「その他のデータ ソース」を展開し、「プロジェクト データ ソース」から OpportunityCsv を選択します。
注意:データソースの種類がここに表示されない場合は、テーブルクラスとコンテキストクラスがプロジェクトに追加されているか、ソリューションがビルドされているかを確認してください。
-
追加した ComboBox を選択してプロパティを開きます。「DataSource」プロパティを選択し、右側のドロップダウンをクリックして、下部にある「新しいオブジェクト データ ソースの追加...」を選択します。
-
表示内容の設定
-
追加した ComboBox を選択してプロパティを開きます。「DisplayMember」プロパティを「Name」に設定します。次に、「ValueMember」プロパティを「Id」に設定します。これらのプロパティを設定することで、各 Account の名前が表示されますが、Account を選択したときに取得される値は Account の ID となります。
- 追加した DataGridView の右上隅にある小さなボタンを選択し、「列の編集...」を選択します。
-
デフォルトでは、DataGridView はテーブル内のすべてのカラムに対して列を作成するため、ここで不要な列を削除できます。Id、Name、AccountId 以外のすべての列を削除します。
-
追加した ComboBox を選択してプロパティを開きます。「DisplayMember」プロパティを「Name」に設定します。次に、「ValueMember」プロパティを「Id」に設定します。これらのプロパティを設定することで、各 Account の名前が表示されますが、Account を選択したときに取得される値は Account の ID となります。
-
すべての Account の読み込み
-
ファイルを右クリックして「コードの表示」を選択し、フォームのコードを開きます。
-
セッション用の DbContext を保持するプライベートフィールドを追加し、OnLoad メソッドをオーバーライドします。完全なコードは以下のようになります。
using Microsoft.EntityFrameworkCore; using WinFormsAppCSV.Models; namespace WinFormsAppCSV { public partial class Form1 : Form { private CSVContext? dbContext; public Form1() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.dbContext = new CSVContext(); this.dbContext.AccountCsvs.Load(); this.accountCsvBindingSource.DataSource = dbContext.AccountCsvs.ToList(); } } }-
このコードは以下の処理を行います:
- ComboBox に表示される Account を読み込むために使用される CSVContext のインスタンスを作成します。
- Load 拡張メソッドを使用して、CSV 接続からすべての Account を DbContext に読み込みます。
- accountCsvBindingSource.DataSource プロパティを、DbContext で追跡されている Account で初期化します。これは AccountCsvs DbSet プロパティに対して .ToList() を呼び出すことで行われます。ToList() により、このデータが ComboBox のリストとして公開されます。
-
ファイルを右クリックして「コードの表示」を選択し、フォームのコードを開きます。
-
Opportunity の読み込み
- フォームのデザイナーで、Account 用の ComboBox を選択します。
-
ComboBox のプロパティで、イベント(稲妻ボタン)を選択し、SelectedValueChanged イベントをダブルクリックします。これにより、Account の選択が変更されるたびに発生するイベントのスタブがフォームコードに作成されます。
-
SelectionValueChanged イベントのコードを記述します:
private void comboBox1_SelectedValueChanged(object sender, EventArgs e) { string selectedAccountId = Convert.ToString(comboBox1.SelectedValue); this.dbContext = new CSVContext(); this.dbContext.OpportunityCsvs .Where(x => x.AccountId == selectedAccountId) .Load(); this.opportunityCsvBindingSource.DataSource = dbContext.OpportunityCsvs.Local.ToBindingList(); }-
このコードは以下の処理を行います:
- AccountId カラムのデータ型に合わせるため、選択された値を文字列に変換します。
- DataGridView に表示される Opportunity を読み込むために使用される CSVContext のインスタンスを作成します。
- Load 拡張メソッドを使用して、指定された Account の Opportunity を CSV 接続から DbContext に読み込みます。
- opportunityCsvBindingSource.DataSource プロパティを、DbContext で追跡されている Opportunity で初期化します。これは OpportunityCsvs DbSet プロパティに対して Local.ToBindingList() を呼び出すことで行われます。Local は追跡されている Opportunity のローカルビューへのアクセスを提供し、ローカルデータと表示データの同期を維持するためのイベントが接続されています。ToBindingList() により、このデータが Windows Forms データバインディングで認識される IBindingList として公開されます。
-
アプリケーションの実行
すべての設定が完了したら、Account.csv ファイルから Account の一覧を表示し、選択した Account に関連する Opportunity を表示するアプリケーションを実行できます。まずソリューションをビルドし、緑色の再生ボタンをクリックしてアプリケーションを起動します。アプリケーションが開いたら、以下のように Account をクリックして、各 Account に関連する Opportunity を確認できます。
データ開発者向け無料 Community ライセンス
CData ADO.NET Provider は、従来のデータベースだけでなく、SaaS、NoSQL、ビッグデータシステムを含む 270 以上のデータソースへの一貫した接続性を提供し、Entity Framework の機能をさらに強化します。
CData ADO.NET Community ライセンスでは、個人の .NET プロジェクトで使い慣れた SQL を通じてデータにアクセスできる、永久無料のライブラリを入手できます。ライセンスをリクエストして、今すぐデータアプリの構築を始めましょう!