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

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

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