久しぶりに新規開発にたずさわる事になり、どうせなら経験ないことやってみようと「Entity Framework」によるDBアクセスに挑戦する事にしました。
そんなに新しい技術でもないけれど、いままで見てきた既存のシステムは「DataSet」だったので、そう思うと新鮮な気分。きっと開発効率も上がるはず。
ただ、C#でやりたかったけどVB.NETでの開発になったところは残念。。。。ここは仕方がないと諦めて前へ進もう!

さて、「Entity Framework」には幾つかの開発方法があり、今回は「コードファースト」でやる事にした。
理由としては、それほど複雑なテーブル構造ではないけれど、テーブルの項目数はかなり多くなりそう。
しかもアジャイル的な開発なので、きっと仕様の変更や項目の変更が多々発生しそうなのでコードだけを意識する事で開発効率があがるのでは。。。と考えたからである。

そんなに甘くはないと、心の声に蓋をして挑戦!

【手順1】WindosFormのソリューションを作成

普通に作ります

【手順2】Entity Framework のインストール

NuGetパッケージマネージャーコンソールで以下のコマンドを打つ

    Install-Package EntityFramework.ja

インストールできた!

【手順3】テーブル作成のためエンティティのクラスを作る

こんな感じ

<Table("hoge_master")>  ' これがテーブル名になる
Public Class HogeMaster

    ''' <summary>
    ''' 項目コード
    ''' </summary>
    ''' <returns></returns>
    <Key>
    <Column("item_cd")>
    Public Property ItemCd As Integer

テーブル名を指定しなかったら、複数形のクラス名になる

【手順4】DbContextを継承した xxxxxContextクラスを作る

こんな感じ

Partial Public Class xxxxxContext
    Inherits DbContext
    Public Property hoge_master As DbSet(Of HogeMaster)
                                              ' ↑ここの部分は、【手順3】のエンティティクラスと合わせてね

【手順5】App.config にDBとの接続を追記する

こんな感じ

  <connectionStrings>
    <add name="xxxxxContext" connectionString="data source=XXXX\SQLEXPRESS;initial catalog=hogeDb;persist security info=True;user id=sa;password=hogehoge;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>

「add name=”xxxxxContext”」 ここは、【手順4】で作ったクラス名に合わせる
DB名は 「catalog=hogeDb」

【手順6】マイグレーションを有効にする

パッケージマネージャーコンソールで以下のコマンドを打つ

    Enable-Migrations

すると、

      Migrations\Configuration.vb

ってファイルが勝手にできる

【手順7】DBとテーブル作成

パッケージマネージャーコンソールで以下のコマンドを打つ

   Add-Migration init

   Update-Database

「init」の部分はなんでもいい。最初なのでinitにしただけ

コマンドが正しく終わっていれば、DB(hogeDb)とテーブル(hoge_master)が出来ているはず!
※Migrations\日付_init.vb  というファイルが勝手にできる

【手順8】新しいテーブルの追加

【手順3】を参考に新しいエンティティクラスを作成し【手順4】のDbSetの部分にも追加して、パッケージマネージャーコンソールで以下のコマンドを打つ

   Add-Migration hogehoge_master

   Update-Database

「hogehoge_master」の部分はなんでもいいけど、作成するテーブル名と合わせた方がいい

コマンドが正しく終わっていれば、新しいテーブル(hogehoge_master)が出来ているはず!
※Migrations\日付_hogehoge_master.vb  というファイルが勝手にできる

【手順9】テーブルの項目を追加する

当然開発しているとテーブルの項目を変更する事態に陥る
そんなときは、該当のエンティティクラスを修正して、同じようにコマンドを打つだけ

   Add-Migration hogehoge_master2  'hogehoge_masterの名前は変えます。
   Update-Database

コマンドが正しく終わっていれば、hogehoge_masterテーブルに項目が追加されているはず!
※Migrations\日付_hogehoge_master2.vb  というファイルが勝手にできる

【手順10】DBの状態を元に戻したい

テーブルを追加したけど、テーブル名を間違って作ってしまった!
などDBの状態を戻したい場合は次のコマンドを打つ

  Update-Database -TargetMigration:init

「init」は戻したい状態の名称

これだけで戻ります。ただし、データも無くなるようです(実際にはまだやっていない)
ここでエンティティクラスのテーブル名を修正して再度コマンドを流すとエラーになる

  Add-Migration hogehoge_master3
    次の明示的な移行が保留中のため、明示的な移行を生成できません。・・・・・・

少々悩み、マイグレーションすると勝手に作られたテーブル(__MigrationHistory)を覗くと、initのレコードはあるけれど、hogehoge_masterとhogehoge_master2のレコードが消えている。
でも、プロジェクトには 「日付_hogehoge_master.vb」と「日付_hogehoge_master2.vb」のソースが残っている
じゃ、このソースみ消しちゃえ! と消していつものコマンド実行したらちゃんとできました(^^)

   Add-Migration hogehoge_master
   Update-Database

よかったです。

今回はここまで!

調査しながらやっていたので学習コストは少々かかりましたが、慣れてしまえばDBなんて意識なくてもほいほいテーブル出来るので便利便利
まだ触りの部分なので、これからデメリットも出てくると思うけど頑張ってみようと思っております

調査にあたり、いろんなサイトを見させていただきました。ありがとうございます
では、開発が頓挫していなければまた会いましょう!