LINQ で使う Entity Data Model を編集する(前哨戦)

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 機能はあまりきちんと実装していないんですよね。この機会に少しテストをしますか。

カテゴリー: C#, EXDoc パーマリンク