実は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
■コントローラーを直す
コントローラーのほうは、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つのリレーションの場合はどうするんでしょうねえ?