新しくWCF DS、EF も出てきたし、2つ合わせてLet’s try

ようやく本日より在宅勤務から解放され品川オフィスに出社しました。在宅は思ってたよりつらいですねー、個人的には向いていないことが良くわかりました。下記に辛かった点を列挙しますが、全て自業自得な気がしてきましたww

・1人暮らしで孤独

・夜も地震の影響で孤独

・人としゃべらない

・夜更かししてしまう

・テーブル作業による肩、腰のこり

・ふと気を緩めるとテレビをつけそうになる

・youtubeも見たくなる

 

 

今日は新しく提供されている下記2つを使って、Code Firstで作ったデータをODataのサービスとして公開してみましょう。尚、ADO Entity Framework 4.1 RCをインストールしてない方は、試しにNuGetを使ってみることをおすすめします。Nugetの日本語リソースはchack411さんのブログが参考になります。現時点ではEF Code Firstのダウンロード数がダントツのようです。

ADO Entity Framework 4.1 RC

WCF Data Services 2011 CTP2

 

データモデルの作成

1.「ASP.NET 空のWebアプリケーション」を選択してプロジェクト”HospitalWeb”を新規作成します。

 

2.プロジェクトにクラス”Model.cs”を追加

 

3.参照の追加で以下の2つを追加します

         - System.ComponentModel.DataAnnotations

        - EntityFramework

 

4.Model.csに下記のクラス(モデルとコンテキスト)を追加。

public class Patient

{

    public int Id { get; set; }

    [MaxLength(64)]

    public string Name { get; set; }

    public virtual ICollection<LabResult> LabResults { get; set; }

}

 

public class LabResult

{

    public int Id { get; set; }

    public string Result { get; set; }

}

 

public class HospitalContext : DbContext

{

    public DbSet<Patient> Patients { get; set; }

    public DbSet<LabResult> LabResults { get; set; }

}

 

5.モデルが変更された際にデータベースを再生成するコードをModel.csへ追加。ついでにサンプルデータの投入もここで行います。

public class HostpitalContextInitializer :DropCreateDatabaseIfModelChanges<HospitalContext>

{

    protected override void Seed(HospitalContext context)

    {

         context.Patients.Add(new Patient { Name = "Fred Peters" } );

         context.Patients.Add(new Patient { Name = "John Smith" } );

         context.Patients.Add(new Patient { Name = "Karen Fredricks" } );

    }

}

 

6.5.の処理が呼び出されるように、HotpitalContext クラスに下記の静的コンストラクタを追加

static HospitalContext()

{

    Database.SetInitializer(new HostpitalContextInitializer());

}

これでモデルの作成は完了です。

 

 

サービスの作成

1.「新しい項目の追加」からWCF Data Services”HospitalService.svc”を追加

 

2.追加されたコンポーネントは.NET 4に対応したものです。面倒ですがCTP2用に置き換える必要があります。置き換えないと実行してもエラーになります。

      - 「参照設定」から”System.Data.Services”、”System.Data.Services.Client”を削除

      - 「参照設定」から”Microsoft.Data.Services”、”Microsoft.Data.Services.Client”を追加。

          DLLは通常、下記の辺りにインストールされていると思います。

          C:\Program Files (x86)\WCF Data Services Mar 2011 CTP2\bin\.NETFramework

          尚、Silverlight用もあります。

          C:\Program Files (x86)\WCF Data Services Mar 2011 CTP2\bin\Silverlight

          英語ですがヘルプもあるのは嬉しいですね。

          C:\Program Files (x86)\WCF Data Services Mar 2011 CTP2\Documentation

          それから、ランタイムのバージョンを見ると”4.99.2”という非常に高い数字になっていますw

 

3.それではHospitalService.svc.csに下記の実装をします。

        いままでV2だったプロトコルバージョンはV3になります。

        ついでにサービスオペレーション”GetPatientsByName”も実装しています。

public class HospitalService : DataService<HospitalContext> { public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule("Patients", EntitySetRights.AllRead); config.SetEntitySetAccessRule("LabResults", EntitySetRights.AllRead); config.SetServiceOperationAccessRule("GetPatientsByName", ServiceOperationRights.AllRead); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3; }

    [WebGet] public IQueryable<Patient> GetPatientsByName(string name) { return CurrentDataSource.Patients.Where(p => p.Name.Contains(name)); } }

 

実装は完了です。実際に実行してみましょう。内部的には以下のようなことをやっています。

・Patientクラス、LabResultクラスからモデルの生成

・モデルからDBオブジェクトの生成

・DBへサンプルデータの投入

・ブラウザへサービスメタデータの表示

 

最後にクエリを実行して適当に公開されているデータを確認しておきましょうね。

https://localhost:55051/HospitalService.svc/Patients/

https://localhost:55051/HospitalService.svc/GetPatientsByName?name='Fred'

 

これでサービスもサクサク作ってみることができますね。