LINQ to MySQL を使って wordpress のデータベースを弄ろうとするときに障壁になるのが、Entity Data Model の自動マッピングです。
のように、自動でマッピングしてくれるのですが、「wp_」のプレフィックスが邪魔だったり、「post_author」のように命名規則が.NET風ではなかったり(C# だったら「PostAuthor」と書きたいところ)。だから、このテーブル名やリスト名を変更したいと思うわけです。
Visual Studio 上でちまちまと名前を変えることもできるのですが、実は *.edmx ファイルを直接書き換えても、マッピングするときの名称を変えることもできます…と言いますから、デザイナ自体がこの *.edmx ファイルを参照しています。
そのまま *.edmx ファイルをエディタで修正してもいいのですが、どうせならば、ざっと効率よいやり方で編集したい、と思う訳です。
こんな風に、データグリッドを使って編集できればよいかなと。
手元の ExDoc を使って XML ファイルを操作すると、こんな感じです。
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 機能はあまりきちんと実装していないんですよね。この機会に少しテストをしますか。



