SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

3層データバインドを正しく活用しよう(後編)

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

[3]EFによるデータアクセスを行うクラスを作成する

 MRRS.DALプロジェクトに"MRRSContext.cs"という名前で新しいクラスを追加し、以下のように編集します。

リスト1 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"というファイル名で以下のように作成します。

リスト2 ILocationRepository.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以外のデータアクセスに切り替えることができますし、モッククラスも作成しやすくなります。

リスト3 LocationRepository.cs
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メソッドを呼び出した際、変更がデータベースに反映されます。

次のページ
ビジネスロジック層の作成

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6498 2013/07/17 17:45

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング