思い出す度にいろいろ試してみたけど、どうにもこうにも...。
Using MySQL with Entity Framework and ASP.NET MVC – Part I « Christopher Patterson
ホントにConnector/Net 6.0でデザイナーつかってORマッピングの定義できるの~??どんだけやってもできないんだけどな~。とりあえず現バージョンではできないってことにしとこう。自分で定義ファイルを書けばできるんだろうけど、それじゃ~、全然便利じゃないしよくわかんないし。あ、コマンドラインで実行したらできたりするのかな?まぁ、いいや。
なので、有料だけどトライアルもあるし、DevartのdotConnect for MySql(Download dotConnect for MySQL)を使う事にする。流石にコレならできるでしょう。買う事になってもDeveloper Editionで$229.95だしね。個人でも買える値段で助かる(買わずにトライアルだけど)。
まずは、インストール。サクッと終了。チュートリアル「dotConnect LINQ to MySQL Tutorial」を見ながら、コードを書いてみようと思ったけど、どうも"Devart LINQ to SQL Model"のItemTemplateが見つからない。おやや?インストールに失敗したのかな?と思いきや、なんの事はない、VSのテンプレートフォルダを見てみたら1033(英語)には入ってるけど1041(日本語)には入って無かっただけでした。DevartLINQtoSQL.zipを1041フォルダにコピーしてdevenv /InstallVSTemplates。これでプロジェクトに追加出来るようになりました。ちなみにテストで使うデータベースのサンプルをどうしようか。検索してみたらMySqlだとSakilaっていうのがNorthwindやAdventureWorks的なデータベースっぽいのでそれをインストールして使う事にしました。
SakilaSampleDB - MySQL Forge Wiki
で、Sakila.lqmlという名前で作成したので、デザイナーでテーブルをチョイチョイ登録しようと思ったら、外部デザイナーが立ち上がった。
ん?なんか違和感。そういうものなのかな、と思いつつ、適当にデータベース登録してテーブル追加して作成。
で?えーと、あ、ProjectメニューにGenerateってある。これをクリックして、なにやらファイルを出力してみる。で、VSに戻ってコンパイル。おぉ~。なんか普通に使える~。
※新しいバージョンで試してみたら、勝手に生成してくれるようになってた。
でも、待てよ。Entity Frameworkってこんなじゃなかったような...。ちゃんと見たら全然違うの作ってた。LINQ to MySqlって書いてるジャン...。やりたかったのはコレじゃなくて"dotConnect for MySQL Entity Framework Tutorial"こっちでした。これはこれで普通に取得やら更新もできたんだけど、リレーションのデータがちゃんと取れなくて、なんでなんで~と頭を抱えて損した。まぁ、いっかと、気を取り直してEntity Framework。今度は間違えないように"ADO.NET Entity Data Model"をちゃんと選んでテーブルを追加。そうそう、これこれ。このウィザードでテーブルを選ぶところでエラーが出て先に進まなかったんだけど、今度はなんの問題も無くクリア。
あとは、Scaffoldでちゃちゃっと作る。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; using System.Transactions; using MonoTest.Models; namespace MonoTest.Controllers { public class SakilaController : Controller { // // GET: /Sakila/ sakilaEFEntities context; public SakilaController() { context = new sakilaEFEntities(); } public ActionResult Index() { var list = (from act in context.actor select act).Take(10).ToList(); return View(list); } public ActionResult Details(int id) { var actor = (from act in context.actor .Include("film_actor") .Include("film_actor.film") where act.actor_id == id select act).FirstOrDefault(); if (actor == null) return RedirectToAction("Index"); return View(actor); } public ActionResult Edit(int id) { var actor = (from act in context.actor where act.actor_id == id select act).FirstOrDefault(); if (actor == null) return RedirectToAction("Index"); return View(actor); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(int id, actor actor) { if (ModelState.IsValid) { using (var ts = new TransactionScope()) { var entity = (from act in context.actor where act.actor_id == id select act).FirstOrDefault(); if (entity != null && actor != null) { actor.actor_id = id; actor.last_update = DateTime.Now; context.ApplyPropertyChanges(entity.EntityKey.EntitySetName, actor); context.SaveChanges(); } ts.Complete(); return RedirectToAction("Details", new { id }); } } return View(actor); } } }
Controllerはこんなので。
ちゃんと動く~。CentOS側のデータを確認してみる。
ちゃんと更新できてる~。なんか嬉しい。でも、Monoで動かしてるわけじゃないので当たり前っすね。これをMonoで動かすのが目的なのでxsp2!
ガッカリです。エラー出て動きませんでした。
ASP.NET Provider Model Support in dotConnect for MySQL
色々試してみたけど、どうやっても動かない。うぎゃ~!!と思って調べて見たら...。MonoではLINQ to Entityが動かないらしい...。凹む。ベコっと音が出た。
続く。