ADO.NET Entity Data Model を作成して利用する (EF Designer を利用したEntity Data Model) - C#

Entity Framework を利用して、ADO.NET Entity Data Model を作成して利用するプログラムを紹介します。
補足
Code First を利用した手順はこちらの記事を参照してください。

概要

ADO.NET Entity Data Modelを作成すると、データベースのテーブルの構造と同じクラス構造(モデル)が自動的に作成され、データベースのレコードと対応します。モデルがインスタンス化されると、データベースとの同期が実行されるため、モデルのインスタンスを生成するだけで、データベースへの接続などを意識せず、簡単にデータベースのレコードへアクセスできます。
モデルの作成方法にはビジュアルなモデルデザイナを利用する「EF Designer」を利用する方法と、モデルのコードを生成する「Code First」の2つの方法があります。この記事では、デザイナを利用してモデルを編集する"EF Designer" を利用する手順を紹介します。

事前準備(データベースの準備)

ADO.NET Entity Data Model を作成する基になるデータベースとテーブルを作成します。
ProductAテーブル
列名データ型Null許容その他
idintFalse主キー
namenchar(128)True
pricedecimal(18, 0)True
categorynchar(10)True

ProductAテーブル レコード
idnamepricecategory
1Penguin500Bird
2Bear1050Mammal
3Duck150Bird
4Camel550Mammal
5Owl185Bird
6Whale880Mammal

プログラム例

Windows Formアプリケーションを作成します。フォームにボタンと複数行のテキストボックスを配置します。


ソリューションエクスプローラーのウィンドウでプロジェクトのノードをクリックして選択し、右クリックします。ポップアップメニューが表示されますので、[追加]メニューの[新しい項目]をクリックします。


[新しい項目の追加]ダイアログが表示されます。


左側のツリービューで[Visual C# アイテム]ノードの子ノードの[Data]ノードをクリックして選択します。下図の画面が表示されますので右側の項目のリストから"ADO.NET Entity Data Model"をクリックして選択します。


ダイアログ下部の[名前]テキストボックスにデータモデルの名称を設定します。今回は"ProductA"テーブルのモデルのため、"ProductAModel"という名称にします。設定後ダイアログ右下の[追加]ボタンをクリックします。


[モデルのコンテンツの選択]画面が表示されます。今回は"データベースから EF Designer"の項目をクリックして選択します。選択後ダイアログ下部の[次へ]ボタンをクリックします。


[データ接続の選択]画面が表示されます。


ダイアログ上部のコンボボックスからデータベースへの接続を選択します。データベースへの接続が無い場合は[新しい接続]ボタンをクリックしデータベースの接続を作成します。


データベースへの接続を選択すすると、認証が必要な接続の場合は、接続文字列に認証情報を含めるかのラジオボタンが有効になります。接続文字列に認証情報を含めるか選択します。今回は認証情報を接続文字列に含めることにするため、[はい、重要情報を接続文字列に含めます。]のラジオボタンをチェックします。チェック後[次へ]ボタンをクリックします。


[データベース オブジェクトと設定の選択]画面が表示されます。


[テーブル]ノードの[dbo]ノード内の先に作成したテーブル[ProductsA]テーブルのノードの左側のチェックボックスをクリックしてチェックを付けます。また、ウィンドウ下部の[モデル名前空間]にモデルの名前空間を入力します。今回はデフォルトで設定された名称 "iPentecSandBoxModel" を利用します。設定ができたら[完了]ボタンをクリックします。


モデルの生成が始まります。途中、下図の[セキュリティ警告]ダイアログが表示されます。[OK]ボタンをクリックして処理を続行します。


モデルの生成が完了すると下図のデザイン画面が表示されます。

コードの記述

先に作成したフォームの[Button1]のClickイベントに処理を記述します。
下記のコードを記述します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SimpleEntityFrameworkDemoEFDesigner
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      iPentecSandBoxEntities entity = new iPentecSandBoxEntities();
      foreach (var p in entity.ProductsA) {
        textBox1.Text += p.name.Trim() + "\r\n";
      }
    }
  }
}

解説

DbContext クラスから派生した、生成されたモデルオブジェクトのインスタンスを作成します。
  iPentecSandBoxEntities entity = new iPentecSandBoxEntities();

モデルオブジェクトのテーブル名のプロパティにレコードの一覧が保存されています。foreach ループによりProductsAテーブルのレコードの値を取得しテキストボックスに表示します。
  foreach (var p in entity.ProductsA) {
    textBox1.Text += p.name.Trim() + "\r\n";
  }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。テキストボックスに下図の文字列が表示されます。先に作成したProductsA テーブルのレコードのname列の値がテキストボックスに表示できていることが確認できます。


Entity Framework を利用してデータベースからレコードの値を取得できました。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-11-26
作成日: 2018-09-10
iPentec all rights reserverd.