常々、LINQ を使うために SQL Server を使う必要があって、じゃあ、Linux+MySQLの組み合わせに対して C#+LINQ はどうアクセスすればよいのか?と思っていたのだが、いつの間にか Entity Framework 相当のもの、というか MySql.Data.EntityFramework が出来ていたらしい。
MySQL :: Download Connector/Net
https://dev.mysql.com/downloads/connector/net/
いきなり、Connector/Net 8.0.11 というバージョンが上がっていて(あちこちの記事は 6.x だったりするんだが)、どうやら4月頃にアップデートしている。
何ができるのというと、Redmine や WordPress の内部にある MySQL に LINQ を使って直接アクセスできるということだ。こんな感じに、wordpress の wp_posts テーブルにACCESSできる。
NuGet から MySql.Data.EntityFramework をインストールする
実は Oracle のサイトから、Connector/Net をインストールしなくても、NuGet にある。
プロジェクトのほうは、MySql.Data.EntityFramework をインストールすれば ok. MySql.Data も一緒にインストールされる。
MySQL のプロバイダをインストールする
EF 自体は、NuGet から取れるのだが、SQL Server のようにデザイナを使いたい場合は、MySQL for Visual Studio をインストールする。
MySQL :: Download MySQL for Visual Studio https://dev.mysql.com/downloads/windows/visualstudio/
これを入れると、EF で「新しい接続」を選択したときに “MySQL Database” ってのが出るようになる
MySQL のテーブルを取り込む
準備ができたら、プロジェクトに「ADO NET Entity Data Model」を追加する。
モデルのコンテンツの選択では、
- データベースから EF Designer
- データベースから Code First
が2つある。Designer は、*.edmx ファイルを作ってグラフィカルなテーブルが表示されるもの。特にグラフィック部分が要らないのであれば、Code First で十分だったりする。
「新しい接続」ボタンをクリックして、MySQL Database を選ぶと、接続先のサーバー名とかを入れる画面が出る。ここで「テスト接続」をして接続できることを確認しておく。
さて、実は Connector/Net 8.0.11 にバグがあるらしく、ここの「詳細設定」を押して、Ssl Mode の値を「None」にしておかないといけない。
マニュアルには SslMode はデフォルトで None なのだけど、初期値が間違っているらしく、次の取得するテーブルを選ぶところで落ちてしまうのだ。
SQL Server に LINQ するときと同じようにクラス化するテーブルを選ぶ。
redmine の projects と issues が無事取得できる。
これで LINQ が使えるので、
private void clickGetIssues(object sender, RoutedEventArgs e)
{
var ent = new RedmineModel.RedmineEntities();
var q = from t in ent.issues
where t.project_id == 10
select t;
lv.ItemsSource = q.ToList();
}
とか
private void clickGetWpPosts(object sender, RoutedEventArgs e)
{
var ent = new WordPressModel.WordpressEntities();
ent.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
var q = from t in ent.posts
orderby t.post_date descending
select new { id = t.ID, title = t.post_title, date = t.post_date }
;
q = q.Take(30);
lv.ItemsSource = q.ToList();
}
な感じで、MySQL へ LINQ を使ってアクセスができる。
ホスティングしている場合は wordpress の MySQL に直接アクセスはできないだろうけど、ローカルで作っているとか高速にページをアップするとか修正するときに便利かもしれない。
