[3]EFによるデータアクセスを行うクラスを作成する
MRRS.DALプロジェクトに"MRRSContext.cs"という名前で新しいクラスを追加し、以下のように編集します。
using System; using System.Data.Entity; namespace MRRS.DAL { public class MRRSContext : DbContext // (1) { public MRRSContext() : this("MRRSContext") // (2) { } public DbSet<Location> Locations { get; set; } // (3) public DbSet<MeetingRoom> MeetingRooms { get; set; } public DbSet<Reservation> Reservations { get; set; } } }
EFコードファーストを用いたデータアクセスクラスを作成する際のポイントは以下のとおりです。
(1)System.Data.Entity.DbContextクラスを継承する
(2)アプリケーション構成ファイルに接続文字列の名前を指定する
ここで指定した"MRRSContext"は、後程MRRS Webサイトのweb.configに記載する接続文字列情報の名前に合わせます。
(3)DbSet型のプロパティを、使用するエンティティの分定義する
エンティティプロジェクトに作成したエンティティクラスを型引数に指定したDbSet型でプロパティを定義します。
[4]リポジトリーインターフェイス、クラスを作成する
[3]で作成したMRRSContextクラスを使用してデータアクセスを行うための、リポジトリーインターフェイス、クラスを、それぞれ"ILocationRepository.cs"、"LocationRepository.cs"というファイル名で以下のように作成します。
using System; using System.Collections.Generic; namespace MRRS.DAL { public interface ILocationRepository { /// <summary> /// 場所名を条件に場所を取得します。 /// </summary> /// <remarks>場所名未指定時は全データを取得します。</remarks> /// <returns></returns> IEnumerable<Location> Select(string locationName); /// <summary> /// IDを指定して場所を取得します。 /// </summary> /// <returns></returns> Location Find(int locationId); /// <summary> /// 場所を追加します。 /// </summary> /// <param name="location"></param> void Insert(Location location); /// <summary> /// 場所を更新します。 /// </summary> /// <param name="location"></param> void Update(Location location); /// <summary> /// 場所を削除します。 /// </summary> /// <param name="location"></param> void Delete(Location location); /// <summary> /// 変更を保存します。 /// </summary> void Save(); } }
リポジトリーインターフェイスを作成する際のポイントは、EFに依存せずエンティティクラスと.NET FrameworkのBCL(Base Class Library)のみを使用するようにすることです。こうすることで、必要があれば簡単にEF以外のデータアクセスに切り替えることができますし、モッククラスも作成しやすくなります。
using System; using System.Collections.Generic; using System.Linq; using System.Data; namespace MRRS.DAL { public class LocationRepository : ILocationRepository // (1) { private MRRSContext context; public LocationRepository() { context = new MRRSContext(); } public IEnumerable<Location> Select(string locationName) { if (String.IsNullOrEmpty(locationName)) { // 場所名未入力 return context.Locations; } else { // 場所名で絞り込み return context.Locations .Where(x => x.LocationName.Contains(locationName)); } } public Location Find(int locationId) { return context.Locations.Find(locationId); } public void Insert(Location location) { context.Locations.Add(location); } public void Update(Location location) { context.Locations.Attach(location); context.Entry<Location>(location).State = EntityState.Modified; // (1) } public void Delete(Location location) { context.Locations.Attach(location); context.Locations.Remove(location); //(2) } public void Save() { context.SaveChanges(); } } }
EFを用いたリポジトリークラスを作成する際のポイントは以下のとおりです。
(1)データの更新時、更新対象データを変更済みにマークする
データの更新を行う際は、まずDbSet.Attachメソッドを呼び出して対象データに接続します。そしてその後、対象データのStateプロパティに対してEntityState.Modifiedを設定することで、変更済みにマークします。こうすることで、DbContextクラスのSavaChangesメソッドを呼び出した際、変更がデータベースに反映されます。