[Entity Framework] コードファーストで、データベース・テーブル作成、データの書き込み・読み込みをしてみた。

C# PostgreSQL

スポンサーリンク


Entity Framework の開発スタイルの1つであるコードファーストを使用して、データベースやテーブルを作成し、データの読み書きをしてみた。

(1) 動作環境

Windows Server 2016 x64
Visual Studio Enterprise 2017 Version 15.7.3
PostgreSQL 10.3

(2) プロジェクトの作成

今回は、コンソールアプリを作成する。

(3) 関連パッケージをインストール

パッケージは、NuGet を使用してインストールする。
「ソリューション エクスプローラー」の「参照」を右クリック、「NuGet パッケージの管理」をクリックする。

「参照」タブをクリックし、パッケージ名を入力して検索する。
一覧から以下のパッケージを選択して、画面右のインストールボタンをクリックすると、インストールが開始される。

  • EntityFramework v6.2.0
  • EntityFramework.ja v6.2.0
  • EntityFramework6.Npgsql v3.1.1
  • Npgsql v4.0.1

すべてのパッケージをインストールしたら、更新プログラムを確認する。
最新の安定バージョンに更新することをお勧めする。

(4) Entity (POCO) クラスの作成

プロパティとテーブルを関連付けるために、POCOクラスを作成し、アノテーションを定義する。

アノテーションについては、以下のサイトが詳しい。

他にもリレーションシップと多重度に関しては以下が詳しい。
「第2回 EF 4.1の規約とデータベースの初期化方法」
http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4codefirst02/ef4codefirst02_02.html

(5) Model クラス作成

Entity を管理するための Model クラスを作成する。

「ソリューション エクスプローラー」から「プロジェクト」を右クリックし、「追加」-「新しい項目」をクリックし、起動した「新しい項目の追加」から「ADO.NET Entity Data Model」を選択する。クラスの「名前」(今回は TestModel.cs)を入力し、「追加」ボタンをクリックする。

今回は、ソースコードを元にデータベースやテーブルを作成していくので「空の Code First モデル」を選択する。

  • 「データベースから EF Designer」
    • 既にあるデータベースを基に ER Designer でモデル作成
    • クラスはモデルから生成
    • データベース接続、モデルの設定、モデルに含めるデータベース オブジェクトを選択できる
  • 「空の EF DEsigner モデル」
    • ER Disigner で空のモデル作成
    • モデルからデータベースを作成可能
    • クラスはモデルから生成
  • 「空の Code First モデル」
    • コードから空のモデル作成
    • モデルからデータベースを作成可能
  • 「データベースから Code First」
    • 既にあるデータベースを基にモデル作成
    • データベース接続、モデルの設定、モデルに含めるデータベース オブジェクトを選択できる

DbContext(System.Data.Entity名前空間)は、データベース接続やエンティティの管理などを担当するクラス
DbSet(System.Data.Entity名前空間)ではエンティティの集合を扱う。登録/更新/削除といったエンティティで行うべき処理をDbSetクラスで把握することができる。

モデルを作成すると、以下のソースコードが出力される。

上記ソースコードから MyEntity クラスを削除し、// public virtual DbSet のコメントを外し、以下のようになるよう編集する。

(6) データベース依存内容の外出し

データベースに依存する内容は、アプリケーション構成ファイル(Web.config または App.config)に記述する。これにより、データベースの設定内容が変更されても、アプリケーションを更新する必要がなくなり、汎用的になる。

(6-1) プロバイダファクトリーの設定

(6-2) 接続用文字列の設定

<connectionString>直下に以下を追加。
name には、Model 名を。<connectionString>の Database には、接続先のDB名を。初回アクセス時に無ければ自動的に作成される。

(6-3) <configSections> の設定

<configSections>直下に以下を追加。

※各パラメーターは本家ドキュメントを参照。
http://www.npgsql.org/doc/
※注意点は自動でapp.config(もしくはweb.config)に設定される以下の部分の「oldVersion」と「newVersion」をNugetでインストールされたNpgsqlのバージョンに合わせること
https://qiita.com/fujimu/items/f46430cce8c89e65e548
今回は以下のように設定した。

(7) データベースの自動生成

コード ファーストのデフォルトの挙動は、起動時にデータベースが存在しない場合、プログラム実行時に自動的に作成する。起動時にデータベースとテーブルが存在する場合、定義内容に差異があればエラーを投げる。

既にあるテーブルを消して起動すれば、新たな構成でテーブルを作り直してくれる。既にあるテーブルのデータを引き継ぎたい場合は、データベース マイグレーションを実施すれば良い。
本稿では、データベース マイグレーションを使用しないため、詳細は割愛する。

初回起動時の挙動を制御したい場合は、IDatabaseInitializerインターフェイスを実装したクラスを使用または継承したクラスを使用する。

  • CreateDatabaseIfNotExists
    データベースが存在しない場合にのみ自動生成を行う
  • DropCreateDatabaseAlways
    常にデータベースを再生成する
  • DropCreateDatabaseIfModelChanges
    データベースが存在しない場合およびモデルが変更された場合に、自動的にデータベースを削除して再生成する

詳細は以下のサイトを参考にするとよい。
「第2回 EF 4.1の規約とデータベースの初期化方法」
http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4codefirst02/ef4codefirst02_03.html

(8) データ書き込み・データ読み込み

以下を実行すると自動的にデータベースとテーブルが作成され、データも挿入していることが分かる。

(9) 開発時に発生したエラー

以上。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です