2014/01/01

[コードファースト]Visual Studio Express 2013 でも、MySQL を Entity Framework で操作可能


以下のエントリーで、Visual Studio Express 2013 (for Web/Windows Desktop) では、MySQL を Entity Framework で操作できないと書きましたが、できないのは「モデルファースト」の場合で、「コードファースト」でなら操作可能でした。

Entity Framework の「モデルファースト」は、Entity Framework の最初からサポートされている機能で、エンティティの概念モデルをダイアログ図で表示し、そのモデルからデータベースを作成し、またモデルに対してプログラミングを行うというものです。

一方の「コードファースト」は、Entity Framework 4.1 から登場した比較的新しい手法で、POCO (Plain Old CLR Object) と呼ばれるクラスに対して操作をすると、自動的にデータベースのデータが更新されるというものです。

実際に、Visual Studio Express 2013 を使用して、コードファーストで MySQL を操作する方法をご紹介します。

前提条件

前提条件は以下の通りとします。

  • MySQL は CentOS 6.5 上の MySQL 5.1
  • Visual Studio Express 2013 + Entity Framework 5.0

Entity Framework が 5.0 になっているのは、どうも MySQL 関連のライブラリが Entity Framework 6.0 をサポートしていないようで、いろいろ試行錯誤をしましたが結局動作しませんでした。ネット上でも動作させた情報はありませんでした。

MySQL Connector/NET の最新版は、Entity Framework 6.0 をサポートしているとあったのですけどね。

事前準備

まず、Visual Studio Express 2013 for Windows Desktop でコンソールアプリケーションのプロジェクトを作成します。

次に、Entity Framework 5.0 をインストールするのですが、NuGet では最新版の 6.0.2 しかインストールできないので、ちょっと面倒な方法でインストールします。

プロジェクトを右クリックして、[追加] – [新しい項目の追加] から [データ] – [EF 5.x DbContext ジェネレータ]を選択し、名前はデフォルトのままで「追加」をクリックします。

pic01

これで、Entity Framework 5.0 がインストールされるのですが、作成されたファイルがコンパイルエラーを起こすので削除します(「Model1.Context.tt」「Model1.tt」)。

次に、MySQL 関連のパッケージを NuGet からインストールします。

プロジェクトを右クリックして、[NuGet パッケージの管理] を選択し、画面左で [オンライン] – [すべて] を選択して、画面右上の検索ボックスに「mysql」と入力し検索を実行します。

pic02

検索結果で表示される「MySql.Data」と「MySql.Data.Entities」をインストールします。

pic03

 

あと、MySQL のサーバー側で user01:pass を作成しておいて、外部からデータベースにアクセスできるようにしておきます。

mysql> grant all privileges on Test.* to user01@"%" identified by 'pass' with grant option;

プログラム作成

では、実際にプログラムの作成に入ります。

今回は、商品を格納する Item クラスを作成します。通常のクラスですが、これがデータベースに格納するデータ形式になります。

・Item.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
  public class Item
  {
    public int Id { get; set; }
    public int Price { get; set; }
    public string Name { get; set; }
  }
}

次に、Item クラスを格納する ItemCategory クラスを作成します。途中で、Category に意味がなくなってしまいましたが、気にしないでください。Items がテーブルに該当します。

・ItemCategory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace ConsoleApplication4
{
  public class ItemCategory : DbContext
  {
    public DbSet<Item> Items { get; set; }
  }
}

あと、App.config に接続文字列の設定を行います。接続文字列の設定を行わないと、SQL Server Express にデータベースを作成に行きます。

・App.config

<connectionStrings>
  <add name="ItemCatalog" connectionString="SERVER=192.168.11.10;UID=user01;PASSWORD=pass;DATABASE=Test" providerName="MySql.Data.MySqlClient" />
</connectionStrings>

これで、クラスとデータベースの設定は終了です。あとは、以下のプログラムを実行したら、自動的にデータベースとテーブルが作成され、データが追加されます。

・Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace ConsoleApplication4
{
  class Program
  {
    static void Main(string[] args)
    {
      //データベース初期化
      Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ItemCategory>());

      using (var db = new ItemCategory())
      {
        //インスタンス作成
        var item = new Item { Name = "はさみ", Price = 1000 };

        //インスタンスを追加
        db.Items.Add(item);

        //データベースに変更を反映
        db.SaveChanges();

        //Items テーブルのデータを取得
        var items = from t in db.Items
              select t;

        //結果出力
        foreach (var i in items)
        {
          Console.WriteLine("{0}:{1}:{2}", i.Id, i.Name, i.Price);
        }

        //キー入力待ち
        Console.ReadKey();

      }
    }
  }
}

実行結果

プログラムを実行すると、以下のようにコンソールが表示されます。

pic04

MySQL 側の確認をします。

Test データベースが、ちゃんと作成されていますね。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Test               |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)

テーブルを確認します。

Items テーブルが、ちゃんと作成されています。それと、コードファースト用の __MigrationHistory も作成されています。

mysql> use Test;
mysql> show tables;
+--------------------+
| Tables_in_Test     |
+--------------------+
| Items              |
| __MigrationHistory |
+--------------------+
2 rows in set (0.00 sec)

Items テーブルのデータを確認します。

ちゃんどデータが登録されていますね。

mysql> select * from Items;
+----+-------+-----------+
| Id | Price | Name      |
+----+-------+-----------+
|  1 |  1000 | はさみ    |
|  2 |  1000 | はさみ    |
|  3 |  1000 | はさみ    |
+----+-------+-----------+
3 rows in set (0.00 sec)

おわりに

Entity Framework 5.0 を使用して、MySQL を操作できることが確認できました。

最新の Entity Framework 6.0 が使えないのは残念ですが、これで Visual Studio Express 2013 でも、Entity Framework + MySQL の開発ができますね。


スポンサーリンク


このエントリーをはてなブックマークに追加




Twitter ではブログにはない、いろんな情報を発信しています。


コメント

コメントを書く



プロフィール

  • 名前:fnya
    経歴:
    SE としての経験は15年以上。様々な言語と環境で業務系システム開発を行い、セキュリティ対策などもしていました。現在は趣味SE。

    Twitter では、ブログでは取り上げない情報も公開しています。


    ブログについて

    このブログは、IT、スマートフォン、タブレット、システム開発などに関するさまざまな話題を取り上げたり、雑感などをつづっています。

    現在、Enty で支援を受け付けています。もしよければご支援ください。



    >>ブログ詳細
    >>自作ツール
    >>運営サイト
    >>Windows 10 まとめ

    Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから