This project is read-only.

目次

概要

Somaが提供するRepositoryパターンの実装を利用したデータ操作の方法を説明します。データ操作は、SQLの自動生成を利用する操作とSQLファイルを利用する操作の2種類に大別されます。

Repositoryパターン

Somaでは、Repositoryパターンを実装したベースクラスSoma.Data.EntityRepositoryBaseを提供します。Soma.Data.EntityRepositoryBaseには次の特徴があります。
  • ObjectContextの隠蔽
  • Object ServicesのID 解決、状態管理、および変更の追跡を無効化
  • SQLの遅延実行の無効化

ObjectContextの隠蔽

ObjectContext(もしくはObjectContextのサブクラス)を隠蔽することでAPIを簡易化します。また、ObjectContextやObjectContextから返されるIDisposable型のインスタンスの破棄を自動化します。

Object ServicesのID 解決、状態管理、および変更の追跡を無効化

キャッシュを無効にすることでパフォーマンスを向上させ、デタッチ、アタッチ、マージなど状態管理を意識した操作を不要にします。

SQLの遅延実行の無効化

LINQ to Entitiesを使用する場合、SQLの発行が遅延される場合がありますが、この機能は開発者にとって直感的ではありません。Soma.Data.EntityRepositoryBaseでは、LINQ to Entitiesを使用した場合でも自動で即時実行するようにします。

Repositoryクラスの作成方法

Soma.Data.EntityRepositoryBaseを継承してEntityクラスごとにRepositoryクラスを作成してください。例えばSomaQuickStartEntitiesというObjectContextクラスとEmployeeというEntityクラスに対しては次のようなRepositoryクラスを作成します。

internal class EmployeeRepository : EntityRepositoryBase<SomaQuickStartEntities, Employee>
{
	public EmployeeRepository()
		: base(() => new SomaQuickStartEntities(EntityConnectionFactory.Create("name=SomaQuickStartEntities")))
	{
	}
}
ポイントは次の3点です。
  1. EntityRepositoryBaseの型パラメータにSystem.Data.Objects.ObjectContextのサブクラスとSystem.Data.Objects.DataClasses.EntityObjectのサブクラスを指定する。
  2. EntityRepositoryBaseのコンストラクタにSystem.Data.Objects.ObjectContextのサブクラスをインスタンス化して返すデリゲートを設定する。
  3. System.Data.Objects.ObjectContextのサブクラスのコンストラクタには、Soma.Data.EntityConnectionFactoryを使用して作成したSystem.Data.EntityClient.EntityConnectionを設定する。

以下のドキュメントでは、このクラスにメソッドを追加するという前提で解説をします。

SQLの自動生成による操作

SQLの自動生成による操作では、扱えるクラスはRepositoryクラスが対象とするEntityクラスに限ります。例えば、Repositoryクラスが対象とするEntityクラスがEmployeeクラスである場合、検索ではEmployeeが基点となります。また、挿入、更新、削除のメソッドのパラメータの型はEmployeeです。

SQLの自動生成による検索

SQLの自動生成による検索を行うにはGetSingleResultメソッドもしくはGetResultListメソッドにLINQ to Entitiesのクエリを渡します。クエリの基点はRepositoryクラスが対象とするEntityクラスです。1件のオブジェクトを取得するにはGetSingleResultメソッドを使用します。複数件のオブジェクトを取得するにはGetResultListメソッドを使用します。

internal class EmployeeRepository : EntityRepositoryBase<SomaQuickStartEntities, Employee>
{
	...

	public IEnumerable<Employee> SelectAll()
	{
		return GetResultList(employee => employee);
	}

	public Employee SelectById(int employeeId)
	{
		return GetSingleResult(employee => employee.Single(e => e.EmployeeId == employeeId));
	}

	public Employee SelectByIdIncludingDepartment(int id)
	{
		return GetSingleResult(employee => employee.Include(e => e.Department).Single(e => e.EmployeeId == id));
	}
}
これらのメソッドを呼び出すコード例を以下に示します。

var repository = new EmployeeRepository();
var employees = repository.SelectAll();
var employee1 = repository.SelectById(1);
var employee2 = repository.SelectByIdIncludingDepartment(1);

SQLの自動生成による挿入

SQLの自動生成による挿入を行うにはEntityRepositoryBaseに定義されたInsertメソッドを呼び出します。Insertメソッドを呼び出すコード例を以下に示します。

var repository = new EmployeeRepository();
var employee = new Employee {EmployeeId = 10, EmployeeName = "Hoge"};
repository.Insert(employee);

SQLの自動生成による更新

SQLの自動生成による更新を行うにはEntityRepositoryBaseに定義されたUpdateメソッドを呼び出します。Updateメソッドを呼び出すコード例を以下に示します。

var repository = new EmployeeRepository();
var employee = repository.SelectById(1);
employee.EmployeeName = "Foo";
repository.Update(employee);

SQLの自動生成による削除

SQLの自動生成による削除を行うにはEntityRepositoryBaseに定義されたDeleteメソッドを呼び出します。Deleteメソッドを呼び出すコード例を以下に示します。

var repository = new EmployeeRepository();
var employee = repository.SelectById(1);
repository.Delete(employee);

SQLファイルを用いた操作

SQLファイルを用いた操作では、Repositoryクラスが対象とするEntityクラス以外の型も扱えます。

SQLファイルを用いた検索

SQLファイルを用いた検索を行うにはGetSingleResultByResourceメソッドもしくはGetResultListByResourceメソッドを使用します。
これらのメソッドの最初の引数にはリソースのプロパティにアクセスするデリゲートを指定します。
2番目の引数にはSQLへのパラメータをプロパティとして公開するオブジェクトを指定します。オブジェクトはプリミティブ型、配列型、System.String型であってはいけません。
パラメータがない場合は指定する必要はありません。また、nullを渡した場合もパラメータがないものとみなされます。

internal class EmployeeRepository : EntityRepositoryBase<SomaQuickStartEntities, Employee>
{
	...

        public Employee SelectByName(string employeeName)
        {
            return GetSingleResultByResource<Employee>(() => EmployeeResource.SelectByName, new {employeeName}).First();
        }
}
この例では、EmployeeResource.resxにSelectByNameをキーとして以下のSQLファイルが登録されているものとします。

select * from Employee where EmployeeName = /* employeeName */'AAA'
Repositoryクラスのメソッドを呼び出すコード例を以下に示します。

var repository = new EmployeeRepository();
var employee = repository.SelectByName("King");

SQLファイルを用いた挿入

SQLファイルを用いた挿入を行うにはInsertByResourceメソッドを使用します。
InsertByResourceメソッドの最初の引数にはリソースのプロパティにアクセスするデリゲートを指定します。
2番目の引数にはSQLへのパラメータをプロパティとして公開するオブジェクトを指定します。オブジェクトはプリミティブ型、配列型、System.String型であってはいけません。
パラメータがない場合は指定する必要はありません。また、nullを渡した場合もパラメータがないものとみなされます。

internal class EmployeeRepository : EntityRepositoryBase<SomaQuickStartEntities, Employee>
{
	...

        public int InsertEmployee(Employee employee)
        {
            return InsertByResource(() => EmployeeResource.Insert, employee);
        }
}
この例では、EmployeeResource.resxにInsertをキーとして以下のSQLファイルが登録されているものとします。

insert into Employee (EmployeeId, EmployeeName, DepartmentId) values (/* EmployeeId */0, /* EmployeeName */'aaa', /* DepartmentId */0)
Repositoryクラスのメソッドを呼び出すコード例を以下に示します。

var repository = new EmployeeRepository();
var employee = new Employee {EmployeeId = 10, EmployeeName = "Hoge"};
repository.InsertEmployee(employee);

SQLファイルを用いた更新

SQLファイルを用いた更新を行うにはUpdateByResourceメソッドを使用します。
UpdateByResourceメソッドの最初の引数にはリソースのプロパティにアクセスするデリゲートを指定します。
2番目の引数にはSQLへのパラメータをプロパティとして公開するオブジェクトを指定します。オブジェクトはプリミティブ型、配列型、System.String型であってはいけません。
パラメータがない場合は指定する必要はありません。また、nullを渡した場合もパラメータがないものとみなされます。

internal class EmployeeRepository : EntityRepositoryBase<SomaQuickStartEntities, Employee>
{
	...

        public int UpdateEmployee(Employee employee)
        {
            return UpdateByResource(() => EmployeeResource.Update, employee);
        }
}
この例では、EmployeeResource.resxにUpdateをキーとして以下のSQLファイルが登録されているものとします。

update Employee set EmployeeName = /* EmployeeName */'aaa' where EmployeeId = /* EmployeeId */0
Repositoryクラスのメソッドを呼び出すコード例を以下に示します。

var repository = new EmployeeRepository();
var employee = repository.SelectById(1);
employee.EmployeeName = "Foo";
repository.UpdateEmployee(employee);

SQLファイルを用いた削除

SQLファイルを用いた削除を行うにはDeleteByResourceメソッドを使用します。
DeleteByResourceメソッドの最初の引数にはリソースのプロパティにアクセスするデリゲートを指定します。
2番目の引数にはSQLへのパラメータをプロパティとして公開するオブジェクトを指定します。オブジェクトはプリミティブ型、配列型、System.String型であってはいけません。
パラメータがない場合は指定する必要はありません。また、nullを渡した場合もパラメータがないものとみなされます。

internal class EmployeeRepository : EntityRepositoryBase<SomaQuickStartEntities, Employee>
{
	...

        public int DeleteEmployee(Employee employee)
        {
            return DeleteByResource(() => EmployeeResource.Delete, employee);
        }
}
この例では、EmployeeResource.resxにDeleteをキーとして以下のSQLファイルが登録されているものとします。

delete from Employee where EmployeeId = /* EmployeeId */0
Repositoryクラスのメソッドを呼び出すコード例を以下に示します。

var repository = new EmployeeRepository();
var employee = repository.SelectById(1);
repository.DeleteEmployee(employee);

Last edited Aug 16, 2010 at 5:24 PM by toshihiro, version 17

Comments

No comments yet.