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