思い出す度にいろいろ試してみたけど、どうにもこうにも...。
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が動かないらしい...。凹む。ベコっと音が出た。
続く。