2011年1月18日火曜日

ASP.NET MVC 3とEntity Framework Code Firstを触ってみた MySQL編

前回というかさっきなのだけどASP.NET MVC 3とEntity Framework Code Firstを触ってみた SQL Server編でSQL ServerをデータストレージとしたEF Code Firstの実装方法を解説した。今回はMySQLを使用する方法を解説する。

前回のソースコードをそのまま流用するのでこちらからダウンロードして欲しい。

・セットアップ
下記からそれぞれ自分の環境のものをダウンロードして欲しい。

MySQL Database
Download MySQL Community Server

MySQLのGUIツール
Download MySQL Workbench

MySQLのデータプロバイダー
Download Connector/Net

・MySQLのセットアップ
MySQLをはじめてインストールしたのだが「How to install MySQL on Windows」を参考に下記のようにセットアップした。

  • Typical Setup
  • スキップSign-Up
  • "Configure the MySQL Server now"をチェックする
  • "Detailed Configuration"
  • "Developer Machine"
  • "Multifunctional Database"
  • "InnoDB Tablespace Settings" 初期状態のままにする
  • "Decision Support (DSS)/OLAP"
  • "Enable TCP/IP Networking"をチェックする。またポート番号3306のままにする。"Enable Strict Mode"をチェックする
  • "Standard Character Set"
  • "Install As Windows Service"をチェックする。また"Launch the MySQL Server automatically"をチェックする
  • ルートパスワードを入力する。忘れないように!理由が無い限り"Enable root access from remote machines"はチェックしないほうが良いよ
  • "execute"をクリックしてインストール終了まで待機する


・接続文字列
ついでWeb.configの接続文字列を下記のように変更する。

<add name="Sengoku" connectionString="Server=localhost;Database=Sengoku;Uid=username;Pwd=yourpassword;" providerName="MySql.Data.MySqlClient" />

providerNameがMySqlClientになっているのに注目して欲しい。前述のConnector/Netがインストールされているとmachine.config(C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config)のDbProviderFactoriesセクションにMySql.Data.MySqlClientが登録されているので特に他の記述は必要ない。

・実行 with Code First
WindowsサービスでMySQLが動作しているのを確認し実行してみよう。これがSQL ServerならばEF Code FirstがDatabaseを作成してくれて正常動作するはずだ。しかし案に相違して「データベースSengokuが見つからない云々」という例外が発生する。

正直、Connector/NetがサポートしていないのかEF Code FirstがCTP5のためサポートされていないのかどちらなのかよく分からない。

・Sengoku Database作成
仕方が無いのでMySQL Administratorにログインし、Sengoku Databaseを作成した。
※ログイン時にUsernameとPasswordが尋ねられる。セットアップ時にPasswordの設定はするけれどUsernameの設定は無かったので面食らうと思うがここではrootと入力すれば良い。


また下記クエリをMySQL Query Browserで実行してTableをSengoku Database上に作成した。

DROP TABLE IF EXISTS `sengoku`.`bushous`;
CREATE TABLE  `sengoku`.`bushous` (
  `bushouid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` nvarchar(10) NOT NULL,
  `address` nvarchar(10) NOT NULL,
  PRIMARY KEY (`bushouid`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `sengoku`.`comments`;
CREATE TABLE  `sengoku`.`comments` (

  `commentid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `commentedbushouid` int(10) unsigned NOT NULL,
  `commentbushouid` int(10) unsigned NOT NULL,
  `text` nvarchar(30) NOT NULL,
  PRIMARY KEY (`commentid`),
  FOREIGN KEY (commentedbushouid) REFERENCES bushous(bushouid),
  FOREIGN KEY (commentbushouid) REFERENCES bushous(bushouid)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

これで再度MySQL AdministratorでSengoku Databaseを確認するとTableが2つできているのが確認できると思う。

・実行
この状態で実行すると下図のように正常動作する。武将登録やコメント追加も行える。


・まとめ
MySQLの場合はDatabaseを事前に用意しておかないといけない、という違いはあるもののおおむねSQL Serverと同じ挙動だった。EF Code Firstが正式リリースされたときにここらへんの修正が入るのか、それともConnector/Netのほうの修正が必要なのかは不明だが、現状さしたる不都合は無さそうだ。

0 件のコメント:

コメントを投稿