RIA Services で Entity の関連を扱いたいときはどうするのか?

Entity の関連というのは、ある Entity が 別の Entity を参照しているような事を指してます。

例:T_受注 と M_取引先 というテーブル(RDB) があって、T_受注は、得意先Id = M_取引先.Id な M_取引先 を参照したい。

CREATE TABLE [T_受注] (
  [Id] int identity(1,1) PRIMARY KEY, 
  [得意先Id] int not null, 
  [金額] decimal 
)

CREATE TABLE [M_取引先] ( 
  [Id] int identity(1,1) PRIMARY KEY, 
  [Name] nvarchar(256) not null 
)

ALTER TABLE [T_受注]  WITH CHECK ADD CONSTRAINT [FK_受注_取引先] FOREIGN KEY([得意先Id])
REFERENCES [M_取引先] ([Id])

これは、Entity Framework だと MSDN ナビゲーション プロパティ (EDM) で実現出来るが、RIA Services でも使用出来るのか試してみた。


手順は、
1.EDM の追加 -> 「モデルに外部キー列を追加」にチェックし T_受注、M_取引先 を選択。
2.ドメインサービスクラス の追加 -> T_受注 を選択。
3.クライアント(Silverlight)側で、データの取得処理呼び出し
これで、試してみたけどダメ。
クライアント側に生成されている Entity のコードには、ナビゲーションプロパティ が反映されていなかった。


ナビゲーションプロパティ が使えなかったので別の方法を二つ試してみた。

  • ビュー(View) か ストアド(StoredProcedure) を作成して、それを、Entity Framework から参照する。

ビュー で試したところ問題なく出来た。

CREATE VIEW [V_受注] AS 
SELECT 
  [T_受注].[Id], 
  [T_受注].[得意先Id], 
  [M_取引先].[Name] AS [得意先Name], 
  [T_受注].[金額] 
FROM 
  [T_受注] INNER JOIN [M_取引先] ON ( 
    [T_受注].[得意先Id] = [M_取引先].[Id] 
  )  

※ストアド では試していない。Entity Framework の新しいバージョンでは、デザイナからストアドを指定出来るらしい。。

  • 自前で Entity を作成し、ドメインサービスクラス に 自前の Entity を返すメソッドを追加する

これも動作したけど、なんか実装方法が気に入らない。。

namespace RiaServiceTest.Web
{
  using System;
  using System.ComponentModel.DataAnnotations;
  using System.Linq;
  using System.Web.DomainServices.Providers;
  using System.Web.Ria;
  using System.Runtime.Serialization;
  using System.Data.Objects.DataClasses;

  [EnableClientAccess()]
  public class DomainService1 : LinqToEntitiesDomainService<AdventureWorksEntities2>
  {
    public IQueryable<T_受注> GetT_受注()
    {
      return this.ObjectContext.T_受注;
    }

    public IQueryable<T_受注Ex> GetT_受注Ex()
    {
      return this.ObjectContext.T_受注.Select(m => new T_受注Ex() {
        Id = m.Id,
        得意先Id = m.得意先Id,
        金額 = m.金額,
        得意先Name = m.M_取引先.Name
      });
    }
  }
  [Serializable()]
  [DataContractAttribute(IsReference = true)]
  public class T_受注Ex : EntityObject
  {
    [Key]
    [DataMember()]
    public int Id { get; set; }
    [DataMember()]
    public int 得意先Id { get; set; }
    [DataMember()]
    public decimal? 金額 { get; set; }
    [DataMember()]
    public string 得意先Name { get; set; }
  }
}


ビューやストアド を使った方がまだスッキリしてる気がする。
他には方法あるのかな?