セッションフォロー(TechEd T2-405 Part4 & 9/18 TechFildersセミナー)

すみません御報告が遅くなりました。TechEdと先日のTechFildersセミナー(9/18)のフォローです。

TechEdでは、Visual Studio 2010が不慮の事故で落ちてしまい中途半端になってしまった箇所です。

9/18では時間が足りなく、「続きはブログで」と言ったら、アンケートでお叱りを受けましたので、次回からはセッションに絶対納めるようにします、申し訳ありませんでした。

シナリオ.~ 汎用性を考慮するには?  ~

この方向性としては、Persistence Ignorance をシステムアーキテクチャとして取り入れてみることを考えてみたいと思います。

Persistence Ignorance とはデータの永続化に対して、特定のテクノロジーやプロダクトに依存しないことをさしています。

詳細はこちらから
https://msdn.microsoft.com/ja-jp/library/dd456853(VS.100).aspx

井上のブログでも紹介しています
https://blogs.msdn.com/daisukei/archive/2009/06/02/visual-studio-2010-ef4-poco-part1.aspx

Persistence Ignoranceの想定される使用シナリオとして代表的なものは、以下のスライドにある記述などがあげられます。
例えば、システム設計として、ModelFirstで考える場合、当然生成物は一般的なクラス(図)になるでしょうから、PIシナリオが適していると言えます。

しかし、ModelFirstは手段であり目的ではありません。なぜModelFirstを行うか?になると別の話題になってきますので、今回は、まず身近な目的で考えて見ましょう、例えばEFでサポートされないデータストアの使用を、将来的に実装したいなどが考えられるのではないでしょうか?

image

と言うことで、セッションでは、ストアとしてXMLとMS-AccessのMDBファイルを使用して、PIシナリオとして、これらを切り替えてみました。(TechEdでは、その最中にVSが落ちたわけですが・・・)

PIを実現するためには、エンティティが特定のプロダクトやテクノロジーに依存しないことが条件になります。しかし、現状のADO.NET EntityFrameworkでは、エンティティの実装(EDM)として、どうしても特定インタフェースを継承しなければなりません。

 

この話はよくしますが、確認方法としては、前々回でもご紹介した以下のツールを使用して、手動でEFを使用した環境を構築します。

EDM ジェネレータ (EdmGen.exe)
https://msdn.microsoft.com/ja-jp/library/bb387165.aspx

具体例は以下が分かりやすいかと思います。
Entity Framework プロジェクトを手動で構成する方法
https://msdn.microsoft.com/ja-jp/library/bb738546.aspx

ここで作成した、CSDL、SSDL、MSL、CS(VB)のコードを用いて環境を作成します。(下図)

image

さて、上記のCS(VB)のコードファイルをダイエットしていくと、最終的に以下のようなコードと向き合うことになります。(例はNorthwindデータベースのProductsエンティティです)

[EdmEntityTypeAttribute(NamespaceName = "NorthwindModel", Name = "Products")]    public partial class Products : IEntityWithChangeTracker ,IEntityWithKey , IEntityWithRelationships    {

       [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]        public int ProductID { get; set; }

       [EdmScalarPropertyAttribute()]        public string ProductName { get; set; }

       [EdmScalarPropertyAttribute()]        public System.Nullable<int> SupplierID { get; set; }

~後略

現バージョンのEFのエンティティとして使用するためには、上記のコードにある、IEntityWithChangeTracker ,IEntityWithKey , IEntityWithRelationships あたりが必要になってくると言うわけです。(エンティティに実装する機能によって必要なインタフェースが変わります)

そこで、こうした記述を排除する方向でPOCO(Plain Old CLR Objects)でのクラスを実装することがPIでは必要になります。

上述した井上のサイトでも、EFの次バージョンを使用したPOCOクラスの実装を紹介していますが、小高は、以前ご紹介したEFのCTPを用いてデモを行っています。

ちょっと長くなってきました(前回が長すぎました・・・)ので、次回の記事でデモを簡単にご紹介したいと思います。