【Silverlight】 WCF RIA Services(DbDomainService) のCRUD基底クラスを作成するには(ジェネリック・クラスの場合)

◆ WCF RIA Services(DbDomainService) のCRUD基底クラス

using System.Linq;
using System.Data;
using System.ServiceModel.DomainServices.Hosting;
using System.ServiceModel.DomainServices.Server;
using System.ServiceModel.DomainServices.EntityFramework;
using System.Data.Entity.Infrastructure;

namespace Web.Services
{
    // CRUDドメインサービス基底クラス
    public abstract class DomainServiceCrud<T> : DbDomainService<RaceContext>
        where T : class
    {
        // 読取
        protected virtual IQueryable<T> GetQuery()
        {
            return this.DbContext.Set<T>();
        }

        // 更新
        protected virtual void UpdateQuery(T entity)
        {
            var original = this.ChangeSet.GetOriginal(entity);

            if (original != null)
            {
                this.DbContext.Set<T>().AttachAsModified<T>(
                    entity, original, this.DbContext);
            }
            else
            {
                this.DbContext.Set<T>().Attach(entity);
            }
        }

        // 生成
        protected virtual void InsertQuery(T entity)
        {
            DbEntityEntry<T> entityEntry = this.DbContext.Entry<T>(entity);

            if (entityEntry.State != EntityState.Detached)
            {
                entityEntry.State = EntityState.Added;
            }
            else
            {
                this.DbContext.Set<T>().Add(entity);
            }
        }

        // 削除
        protected virtual void DeleteQuery(T entity)
        {
            DbEntityEntry<T> entityEntry = this.DbContext.Entry<T>(entity);

            if (entityEntry.State != EntityState.Deleted)
            {
                entityEntry.State = EntityState.Deleted;
            }
            else
            {
                this.DbContext.Set<T>().Attach(entity);
                this.DbContext.Set<T>().Remove(entity);
            }
        }
    }
}

◆ 使用例

using System.Linq;
using System.ServiceModel.DomainServices.Hosting;
using System.ServiceModel.DomainServices.Server;

namespace Web.Services
{
    [EnableClientAccess()]
    public class CrudService : DomainServiceCrud<Race>
    {
        // 読取
        [Query]
        public IQueryable<Race> GetRaces()
        {
            return base.GetQuery();
        }

        // 更新
        [Update]
        public void UpdateRace(Race entity)
        {
            base.UpdateQuery(entity);
        }

        // 生成
        [Insert]
        public void InsertRace(Race entity)
        {
            base.InsertQuery(entity);
        }

        // 削除
        [Delete]
        public void DeleteRace(Race entity)
        {
            base.DeleteQuery(entity);
        }
    }
}

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中