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; }
}
}
ビューやストアド を使った方がまだスッキリしてる気がする。
他には方法あるのかな?