Repository
Entity FrameworkのサンプルだとDaoじゃなくてRepositoryのほうが多い気がするのでDBアクセスを行うクラスをRepositoryと呼ぶことにします。自分の中ではどっちもおんなじですけど。
アプリでつくるRepositoryはこんな感じになります。
public class EmployeeRepository : RepositoryBase<MyObjectContext> { public IEnumerable<Employee> SelectEmployeesBySalaray(decimal max, decimal min) { return Select<Employee>(() => MyResource.SelectEmployeesBySalaray, new {max, min}); } }
親クラスのRepositoryBaseはSomaが提供するクラス、型パラメータのMyObjectContextはEntity FrameworkのObjectContextの子クラス(SQL Serverから自動生成)、Employeeはエンティティクラス(SQL Serverから自動生成)、MyResourceはSQLを管理するリソースファイル(から自動生成されるクラス)。
SQLは、こんな感じで記述しておいてSQLコメントでバインド変数を示します。バインド変数は匿名型のプロパティとマッピングされます。
select * from employee where salary < /* max */1000 and salary > /* min */500
上のEmployeeRepositoryで
Select<Employee>(MyResource.SelectEmployeesBySalaray, new {max, min});
ではなく
Select<Employee>(() => MyResource.SelectEmployeesBySalaray, new {max, min});
としているのは、MyResource.SelectEmployeesBySalaray_oracleみたいなリソースが存在する場合に接続先のDBがOracleだったらそっちのリソースを使用するといった機能のための対応です。Expressionで渡すことで、「SelectEmployeesBySalaray」プロパティの値とともに「SelectEmployeesBySalaray」プロパティのメンバ名を取得できるようになるので。Expressionを使ってメンバの名前をとる方法はhttp://d.hatena.ne.jp/okazuki/20100106が参考になりました。
最初のバージョンではSQL Serverしか考えないのでこの機能は不要なのですが、来年にはOracleがEntity Frameworkをサポートするそうなので、そうなったときに困らないようにあらかじめ対応しておきます。