常々、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 が使えるので、
1 2 3 4 5 6 7 8 | 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(); } |
とか
1 2 3 4 5 6 7 8 9 10 11 | 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 に直接アクセスはできないだろうけど、ローカルで作っているとか高速にページをアップするとか修正するときに便利かもしれない。