ASP.NET MVC から wordpress のデータを扱う(3)

実はEDM(Entity Data Model)では、あらかじめデータベースでリレーションを設定しておくと、モデルのほうでアソシエーションが設定されます…って、なんだか分かりませんね(汗)

要は、こんな感じです。
最初の SQL Server 2008 R2 上で、リレーションを設定します。

ダイアグラムではこんな風。

このあたり、.NET ラボの勉強会で話したのですが、SQL Server Management Studio はそれなりに新しくなっていくのに、このダイアグラムは SQL Server 7.0 の頃と変わり映えしません。時代遅れなのか、誰も使っていないのかというところですが、データベース上の外部キーって大切なんですけどねぇ。

これを Visual Studio の EDM を更新すると、こんな風にアソシエーションが設定されます。

ちなみに、データベース上では「リレーション」とか「外部キー」と言われるんですが、オブジェクト指向の方(CakePHPとかも)の O/R マッピングの世界では「アソシエーション」って言っているようです。どちらでもいいんですが、統一してほしいような気が(機能が違うからっていう意味もあるでしょうが)。

こういう風にしておくと、wp_posts モデルの中に wp_users というプロパティ(ナビゲーション)が出来きます。逆向きの wp_users モデルの中にもできますね。
これのナビゲーションを使うと、wp_posts.wp_users.display_name というように、関係するテーブルの列名を表示させることができるのです。

この機能をうまく使うと、ビューが簡単になります。

■ビューを作る

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcWordpress.wp_posts>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
	Recent
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>最近投稿した記事</h2>
    <table>
        <tr>
            <th>ID</th>
            <th>post_date</th>
            <th>post_title</th>
            <th>post_author</th>
            <th>User.display_name</th>
            <th>guid</th>
        </tr>
        <% foreach (var item in Model) { %>
            <tr>
                <td><%: item.ID %></td> 
                <td><%: item.post_title %></td>
                <td><%: item.post_date %></td>
                <td><%: item.post_author %></td>
                <td><%: item.wp_users.display_name %></td>
                <td><%: item.guid %></td>
            </tr>
        <% } %>
    </table>
    <h2>最近投稿した記事(リンク版)</h2>
    <ul>
        <% foreach (var item in Model) { %>
        <li>
            <a href="<%: item.guid %>"><%: item.post_title %></a>
            by <%: item.wp_users.display_name %>
            at <%: item.post_date %>
        </li>
        <% } %>
    </ul>
</asp:Content>

渡されるモデルは、wp_posts のコレクションということで、IEnumerable と指定し直します。こうすると、wp_posts の列名はそのまま使えるし、関連する wp_users のテーブルも「<%: item.wp_users.display_name %>」のように簡単に参照できます。

■コントローラーを直す

コントローラーのほうは、LINQ to Entities に直して、wp_posts テーブルだけを参照するようにします。参照先のテーブルは、自動的に読み込まれるので LINQ 自体も簡単になります。

public ActionResult Recent()
{
    int max = 5;
    wordpressEntities ent = new wordpressEntities();
    var model = (from p in ent.wp_posts
                 where p.post_status == "publish"
                 orderby p.post_date descending
                 select p).Take(max);

    return View(model);
}

このあたり、CakePHP の Model::$belongsTo と同じような使い方ができます。というか、同じようにするために外部キー/アソシエーション/ナビゲーションを利用する訳です。

実行するとすんなり動きます。

こんな訳で、1段階のリレーションは簡単にできるのですが、さて、4つのリレーションの場合はどうするんでしょうねえ?

カテゴリー: ASP.NET, Wordpress パーマリンク