LINQ to MySQL を使って wordpress のデータベースを弄ろうとするときに障壁になるのが、Entity Data Model の自動マッピングです。
のように、自動でマッピングしてくれるのですが、「wp_」のプレフィックスが邪魔だったり、「post_author」のように命名規則が.NET風ではなかったり(C# だったら「PostAuthor」と書きたいところ)。だから、このテーブル名やリスト名を変更したいと思うわけです。
Visual Studio 上でちまちまと名前を変えることもできるのですが、実は *.edmx ファイルを直接書き換えても、マッピングするときの名称を変えることもできます…と言いますから、デザイナ自体がこの *.edmx ファイルを参照しています。
そのまま *.edmx ファイルをエディタで修正してもいいのですが、どうせならば、ざっと効率よいやり方で編集したい、と思う訳です。
こんな風に、データグリッドを使って編集できればよいかなと。
手元の ExDoc を使って XML ファイルを操作すると、こんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | string _filename = @"Model1.edmx" ; EXDocument _doc = null ; /// <summary> /// 読込ボタン /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click( object sender, EventArgs e) { _doc = new EXDocument(); _doc.Load(_filename); // リストにテーブル名を表示 EXElements tables = _doc * "EntitySet" % "store:Type" == "Tables" ; listBox1.Items.Clear(); foreach ( var el in tables) { Debug.Print( "table: {0}" , el % "Name" ); listBox1.Items.Add(el % "Name" ); } } /// <summary> /// リスト選択 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listBox1_SelectedIndexChanged( object sender, EventArgs e) { if (listBox1.SelectedIndex == -1) return ; string name = ( string )listBox1.SelectedItem; EXElement el = _doc * "MappingFragment" % "StoreEntitySet" == name; var items = from t in el / "ScalarProperty" select new ScalarProperty { Name = t % "Name" , ColumnName = t % "ColumnName" }; dataGridView1.DataSource = items.ToList(); } /// マッピングクラス /// </summary> public class ScalarProperty { public string Name { get ; set ; } public string ColumnName { get ; set ; } } |
手前味噌ですが、XML ファイルを直感的に扱えるのでコーディングが結構楽かなと。あと、返す値が List なので、実はそのまま LINQ が使えます。これは結構便利かも。
と言いつつ、ExDoc の Save 機能はあまりきちんと実装していないんですよね。この機会に少しテストをしますか。