連載:ADO.NET Entity Framework入門

第7回 EF4によるN層アーキテクチャと自己追跡エンティティ【後編】

WINGSプロジェクト 土井 毅 著/山田 祥寛 監修
2011/01/07
Page1 Page2 Page3

■Silverlightアプリケーションの実装 − サービス参照の追加

 続けてSilverlightアプリケーションの実装に入ろう。

 今回実装するのは、WCFでエンティティを取得して、DataGridコントロールで表示/編集機能を実装し、更新したエンティティをWCFによりサーバに送信するサンプルである。なお、Silverlight自体の機能や使い方については省略するため、詳細については「連載:.NETを知らない人でも分かるSilverlight入門」などを参照していただきたい。

 まず、WCFサービスをSilverlightから利用できるようにする必要がある。SilverlightはWCFとの親和性が高く、「サービス参照の追加」というVisual Studioの機能を用いることで、サーバ側で定義されたサービスのメタ情報を元に、WCF呼び出しを行うためのプロキシ・コードをクライアント側に自動生成することができる。

 今回も「サービス参照の追加」機能を用いるが、その前に自己追跡エンティティのコードをSilverlightプロジェクトに追加しておこう。詳細は後述するが、必ずサービス参照を追加する“前に”自己追跡エンティティを忘れずに追加しておこう。

 これには、AddressBookSilverlightAppプロジェクトで、(メニューバーの)[プロジェクト]−[既存項目の追加]から、図6のようにAddressBookDataプロジェクトのEntry.cs/Entry.vb、Category.cs/Category.vb、AddressBookModelSelfTracking.cs/AddressBookModelSelfTracking.vbなどのファイルを追加する。


図6 自己追跡エンティティのコードをSilverlightプロジェクトに追加
メニューバーの[プロジェクト]−[既存項目の追加]から表示される[既存項目の追加]ダイアログで、AddressBookDataプロジェクトの自己追跡エンティティのコードをSilverlightプロジェクトに追加する。

 この操作は一見、特別なことには見えないが、SilverlightプロジェクトにEntity Frameworkで生成したエンティティのコードを追加し、それでも問題が起きていないという点は注目に値する。

 例えば、サーバ側でWCFサービスを実装する際は、AddressBookDataプロジェクトへの参照を追加することで自己追跡エンティティにもアクセスできたが、Silverlightのプロジェクトから、Silverlight以外のプロジェクトへの参照を追加することはできない。これは単にVisual Studioで制限されているというだけでなく、Silverlightが.NET Frameworkのサブセット的な位置付けにあり、完全な相互乗り入れが行えないことが原因である。実際、AddressBookDataプロジェクトではEntity Frameworkを使用しているが、SilverlightではEntity Frameworkを直接利用することはできない。

 今回はAddressBookDataプロジェクトへの参照を追加するのではなく、自己追跡エンティティの実装コードを直接Silverlightのプロジェクトに追加している。これは、前回確認したように、自己追跡エンティティがPOCOベースであり、Entity Frameworkに依存していないために可能となっている。

 次に、WCFサービスを呼び出せるようにするため、(メニューバーの)[プロジェクト]−[サービス参照の追加]を実行する。図7のように[サービス参照の追加]ダイアログが表示されるので、[探索]ボタンを押し、サーバ側で公開されているAddressBookService.svcへの参照を追加しよう。


図7 WCFサービスへの参照を追加
メニューバーの[プロジェクト]−[サービス参照の追加]から表示される[サービス参照の追加]ダイアログで追加しているところ。

 サービス参照を追加すると、図8のように[Service References]−[AddressBookServiceReference]という項目がソリューション・エクスプローラに追加され、AddressBookServiceClientというWCFサービスを呼び出すためのプロキシ・クラスが生成される。


図8 追加されたサービス参照(ソリューション・エクスプローラ)
サービス参照(Service Reference)の項目に「AddressBookServiceReference」が追加され、プロキシ・クラスが生成される。

 なお今回は、サービス参照を追加する時点で、WCFサービスで使用している自己追跡エンティティのコードがSilverlightプロジェクトに追加されているため、Entryなどのエンティティ・クラスへの参照は既存の自己追跡エンティティの定義が使用される。

 この際、自己追跡エンティティのコードを事前に追加せず、サービス参照を追加した場合には、該当するクラスが既存のコードに存在しないため、WCFサービスのメタ情報を元にEntryなどのエンティティ・クラスが自動生成されることになる。この場合にはエラーは発生せず、またエンティティ・クラスのプロパティなどはまったく同じように定義されているため、一見問題なく呼び出しが行えるように見える。

 しかし、そこで自動生成されるクラスは自己追跡処理を実装していないため、サーバからのエンティティの取得処理は問題なく行えるが、更新処理が正しく動かない(エラーは出ないが、データベースへの書き戻しが行われない)という現象に直面する。非常に陥りやすいポイントなので、十分注意していただきたい。


 INDEX
  ADO.NET Entity Framework入門
  第7回 EF4によるN層アーキテクチャと自己追跡エンティティ【後編】
    1.WCFによるサービスの公開/プロジェクトの追加/WCFサービスの実装
  2.Silverlightアプリケーションの実装 − サービス参照の追加
    3.UI実装とWCFサービス呼び出し/サンプルの実行/まとめ
 
インデックス・ページヘ  「ADO.NET Entity Framework入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間