かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

更新系の処理を作ってみよう サーバー編

これまで、検索系をまったりと作りましたが、ここからは更新系の処理を.NET RIA Servicesで作ってみようと思います。
更新系の処理を出来るようにするためには、InsertXXX, UpdateXXX, DeleteXXXという名前で戻り値がvoid, 引数にエンテティを受け取るメソッドをDomainServiceクラスに作ればOKです。

using System.Linq;
using System.Web.DomainServices;
using System.Web.Ria;
using System.Diagnostics;

namespace CrudRIAServices.Web
{
    [EnableClientAccess()]
    public class EmployeesDomainService : DomainService
    {
        public IQueryable<Employee> GetEmployees()
        {
            return EmployeesDataStore.GetEmployees();
        }

        public void InsertEmployee(Employee emp)
        {
            Debug.WriteLine("Insert: " + emp);
            EmployeesDataStore.Insert(emp);
        }

        public void UpdateEmployee(Employee emp)
        {
            Debug.WriteLine("Update: " + emp);
            EmployeesDataStore.Update(emp);
        }

        public void DeleteEmployee(Employee emp)
        {
            Debug.WriteLine("Delete: " + emp);
            EmployeesDataStore.Delete(emp.ID);
        }
    }
}

コード自体は、簡単です。
このように、登録更新削除のメソッドを追加すると、Silverlight側に自動生成されるコードが以下のように変わってきます。

// Update, Insert, Delete追加前に自動生成されたコード
internal sealed class EmployeesDomainContextEntityContainer : EntityContainer
{
    
    public EmployeesDomainContextEntityContainer()
    {
        this.CreateEntityList<Employee>(EntityListOperations.None);
    }
}
// Update, Insert, Delete追加後に自動生成されたコード
internal sealed class EmployeesDomainContextEntityContainer : EntityContainer
{
    
    public EmployeesDomainContextEntityContainer()
    {
        this.CreateEntityList<Employee>(EntityListOperations.All);
    }
}

DomainContextのEmployeesプロパティの実体であるEntityListを作っているであろう部分のコードがNoneからAllに変わっています。この引数は、EntityListに対して何の操作が出来るかを表すものです。
ためしに、Deleteメソッドを消すと

internal sealed class EmployeesDomainContextEntityContainer : EntityContainer
{
    
    public EmployeesDomainContextEntityContainer()
    {
        this.CreateEntityList<Employee>((EntityListOperations.Add | EntityListOperations.Edit));
    }
}

こんな風に追加と更新が出来ることを表すAddとEditが引数に渡されるようになります。今回は、登録・更新・削除全てやるつもりなので、Insert Update Deleteメソッドを全てDomainServiceに追加しておきます。

次は、クライアント側を作っていきます。