【Silverlight】Entity Framework + WCF RIA Servicesで、Code First(コード・ファースト)開発を行うには

◆ 修正履歴

2011/07/11
 IISにデプロイした場合、System.ServiceModel.EndpointNotFoundException が
発生する不具合修正。(DomainService から DbDomainService クラスへ変更)

◆ 事前準備

1. Entity Framework 4.1のインストール
  ★NuGet
    http://nuget.org/List/Packages/EntityFramework
  ★インストーラー
    http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=8363
    ・Webプロジェクト側に、EntityFramework.dll を参照設定

2. RIAServices.EntityFramework のインストール
  ★NuGet
    http://nuget.org/List/Packages/RIAServices.EntityFramework
  ★インストーラー
    http://www.silverlight.net/getstarted/riaservices/
    ・Webプロジェクト側に、
      Microsoft.ServiceModel.DomainServices.EntityFramework.dll を参照設定

◆ モデル・クラス(エンティティの定義)

using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Collections.Generic;

namespace TestApplication.Web.Models
{
    // Contextクラス(DBのテーブル情報)
    public class ScheduleContext : DbContext
    {
        public DbSet<Schedule> Schedules { get; set; }
    }

    // Entityクラス(テーブルのフィールド情報)
    public class Schedule
    {
        [Key]
        public int ScheduleId { get; set; }

        public string RecordSpec { get; set; }
        public string DataKubun { get; set; }
        public int MakeDate { get; set; }

        public int Ymd { get; set; }
        public string JyoCD { get; set; }
        public int Kaiji { get; set; }
        public int Nichiji { get; set; }
        public int YoubiCD { get; set; }
    }

    /// DB生成処理クラス
    /// 【Ex】
    ///   CreateDatabaseIfNotExists<T> : DBが存在しない場合のみ生成
    ///   DropCreateDatabaseIfModelChanges<T> : モデルが変更された場合のみ再生成
    ///   DropCreateDatabaseAlways<T> : アプリケーション起動時に常にDBを再生成
    public class ScheduleInitializer
        : DropCreateDatabaseIfModelChanges<ScheduleContext>
    {
        protected override void Seed(ScheduleContext context)
        {
            // 初期レコードの作成
            var schedule = new List<Schedule>
            {
                new Schedule
                {
                    ScheduleId = 1,
                    Ymd = 20110101,
                    JyoCD = "01",
                    Kaiji = 1,
                    Nichiji=1
                }
            };

            schedule.ForEach(s => context.Schedules.Add(s));
            context.SaveChanges();
        }
    }
}

◆ Global.asax(起動時にDB生成処理を実行)

using System.Data.Entity;
using TestApplication.Web.Models;

namespace TestApplication.Web
{
    public class Global : System.Web.HttpApplication
    {
        protected void 
            Application_Start(object sender, EventArgs e)
        {
            // DBを生成
            Database.SetInitializer<ScheduleContext>
                (new ScheduleInitializer());
        }
    }
}

◆ Web.config(DB接続情報+WCF RIA Servicesの定義)

<?xml version="1.0"?>
<configuration>
  // 省略
  <!-- WCF RIA Servicesで使用-->
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="DomainServiceModule" preCondition="managedHandler" 
        type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, 
        System.ServiceModel.DomainServices.Hosting, 
        Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </modules>
    <validation validateIntegratedModeConfiguration="false" />
  </system.webServer>
  <system.web>
    <httpModules>
      <add name="DomainServiceModule" 
      type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, 
          System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, 
          Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </httpModules>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Data.Entity, 
        Version=4.0.0.0, 
        Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
  </system.web>
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
      multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <!-- DB接続名は、Contextクラスのと同一に設定(命名規則)-->
  <connectionStrings>    
    <add name="ScheduleContext" 
    connectionString="Data Source=|DataDirectory|MyDb.sdf" 
    providerName="System.Data.SqlServerCe.4.0"/>
  </connectionStrings>
  // 省略
</configuration>

◆ WCF RIA Services

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.DomainServices.Hosting;
using System.ServiceModel.DomainServices.Server;
using System.ServiceModel.DomainServices.EntityFramework;

namespace TestApplication.Web.Services
{
    using TestApplication.Web.Models;

    [EnableClientAccess()]
    public class ScheduleService : DbDomainService<ScheduleContext>
    {
        public IQueryable<Schedule> GetSchedule()
        {
            return this.DbContext.Schedules;
        }
    }
}

◆ Silverlight(C# Code)

var ctx = new ScheduleContext();

var query = from schedule in ctx.GetScheduleQuery()
            select schedule;

ctx.Load(query).Completed += (e, s) =>
{
    var scheduleList = ctx.Schedules.ToList();
};

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中