Entity Framework Code First アプローチとリポジトリ パターンを使用して ASP.NET Web API を作成する
この記事では、リポジトリ パターンと Entity Framework Code First アプローチを使用して ASP.NET Web API を作成する方法について説明します。
この記事では、リポジトリ パターンと Entity Framework Code First アプローチを使用して ASP.NET Web API を作成する方法について説明します。
基本的に、次の方法を学習します。
- エンティティとリポジトリインターフェイスを含むコアプロジェクトを作成します。
- Entity Framework コード優先アプローチを使用して、データベース操作コードを含むインフラストラクチャ プロジェクトを作成します。
- エンティティに対して CRUD 操作を実行する Web API を作成します。
- jQuery アプリケーションで Web API を使用し、Ignite UIチャートにデータをレンダリングします。
リポジトリパターンとは何ですか?
まず、リポジトリパターンが必要な理由を理解しましょう。リポジトリパターンに従わず、データを直接使用すると、次の問題が発生する可能性があります。
- Duplicate code
- キャッシュなどのデータ関連のロジックまたはポリシーの実装が困難
- データアクセス層を持たずにビジネスロジックを単体テストすることの難しさ
- 緊密に結合されたビジネスロジックとデータベースアクセスロジック
リポジトリパターンを実装することで、上記の問題を回避し、次の利点を得ることができます。
- ビジネス・ロジックは、データ・アクセス・ロジックなしで単体テスト可能
- データベース・アクセス・コードを再利用可能
- データベースアクセスコードは一元管理されるため、キャッシュなどのデータベースアクセスポリシーを簡単に実装できます。
- ドメインロジックの実装が簡単
- ドメイン・エンティティーまたはビジネス・エンティティーは、注釈を使用して厳密に型付けされます。
それらがどれほど優れているかをリストしたので、ASP.NET Web API にリポジトリ パターンを埋め込み始めましょう。
コアプロジェクトを作成する
コアプロジェクトでは、エンティティとリポジトリインターフェイスを保持する必要があります。この例では、City エンティティを使用します。そこで、以下のリストに示すようにクラス City を作成しましょう。
using System.ComponentModel.DataAnnotations;
namespace WebApiRepositoryPatternDemo.Core.Entities
{
public class City
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
public string Country { get; set; }
public int Population01 { get; set; }
public int Population05 { get; set; }
public int Population10 { get; set; }
public int Population15 { get; set; }
}
}
ご覧のとおり、System.ComponentModel.DataAnnotations の一部であるRequired属性を使用してデータに注釈を付けています。次の 2 つのアプローチのいずれかを使用して、都市エンティティに注釈を付けることができます。
- System.ComponentModel.DataAnnotations の使用
- Using the Entity Framework Fluent API
どちらのアプローチにも独自の利点があります。ドメイン・エンティティーに対する制限がドメインの一部であると考える場合は、コア・プロジェクトでデータ・アノテーションを使用します。ただし、制限がデータベースに関連していると考え、データベース テクノロジとして Entity フレームワークを使用する場合は、流暢な API を使用します。
次に、リポジトリインターフェイスを作成しましょう。City エンティティに対して実行する操作は、リポジトリ インターフェイスの一部である必要があります。 ICityRepository インターフェイスは、次のリストに示すように作成できます。
using System.Collections.Generic;
using WebApiRepositoryPatternDemo.Core.Entities;
namespace WebApiRepositoryPatternDemo.Core.Interfaces
{
public interface ICityRepository
{
void Add(City b);
void Edit(City b);
void Remove(string Id);
IEnumerable<City> GetCity();
City FindById(int Id);
}
}
コアプロジェクトには、データベース操作に関連するコードを含めるべきではないことに注意してください。したがって、次の参照はコアプロジェクトの一部であってはなりません。
- 任意の外部ライブラリへの参照
- 任意のデータベースライブラリへの参照
- LINQ to SQL、エンティティフレームワークなどのORMへの参照。
エンティティクラスとリポジトリインターフェイスを追加すると、コアプロジェクトは次の画像のようになります。

インフラストラクチャ プロジェクトを作成する
インフラプロジェクトでは、アプリケーション外に関連する業務を行います。例えば:
- Database operations
- Web サービスの利用
- ファイルシステムへのアクセス
データベース操作を実行するには、Entity Framework Code First アプローチを使用します。CRUD 操作を実行する必要がある市エンティティは既に作成されていることに注意してください。基本的に、CRUD 操作を有効にするには、次のクラスが必要です。
- DataContext class
- コアプロジェクトで作成されたリポジトリインターフェイスを実装するリポジトリクラス
- DataBaseInitalizer class
次に、インフラストラクチャ プロジェクトに次の参照を追加する必要があります。
- Entity フレームワークの参照。これを追加するには、プロジェクトを右クリックし、[Nugetパッケージの管理]をクリックしてから、Entityフレームワークをインストールします
- コアプロジェクトのリファレンス
DataContext class
In the DataContext class:
- City エンティティのテーブルを作成する DbSet プロパティを作成します
- DataContext クラスのコンストラクターで、データベースが作成される接続文字列名を渡します
- CityDataContext class will inherit the DbContext class
CityDataContextクラスは、次のリストに示すように作成できます。
using System.Data.Entity;
using WebApiRepositoryPatternDemo.Core.Entities;
namespace WebApiRepositoryPatternDemo.Infrastructure
{
public class CityDataContext : DbContext
{
public CityDataContext() : base("name=cityconnectionstring")
{
}
public IDbSet<City> Cities { get; set; }
}
}
必要に応じて、接続文字列を渡すか、Entity Framework を使用してデータベースを作成できます。インフラストラクチャ プロジェクトの app.config に接続文字列を設定します。次のリストに示すように、接続文字列を設定しましょう。
<connectionStrings> <add name="cityconnectionstring" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=CityPolulation;Integrated Security=True;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/> </connectionStrings>
データベース初期化クラス
作成時にデータベースに初期値を供給するために、データベース初期化クラスを作成する必要があります。 Database initialize クラスを作成するには、クラスを作成し、DropCreateDatabaseIfModelChnages から継承します。ここでは、モデルが変更された場合にデータベースを再作成するように値を設定しています。エンティティフレームワークの他のオプションを調べて、クロスポンディングクラスからデータベース初期化クラスを継承することもできます。 Seed メソッドでは、Cities テーブルの初期値を設定できます。3 つの都市のレコードを使用して、次のリストに示すようにデータベース初期化子クラスを作成できます。
using System.Data.Entity;
using WebApiRepositoryPatternDemo.Core.Entities;
namespace WebApiRepositoryPatternDemo.Infrastructure {
public class CityDbInitalize : DropCreateDatabaseIfModelChanges<CityDataContext> {
protected override void Seed(CityDataContext context) {
context.Cities.Add(new City {
Id=1,
Country="India",
Name="Delhi",
Population01=20,
Population05=22,
Population10=25,
Population15=30
});
context.Cities.Add(new City {
Id=2,
Country="India",
Name="Gurgaon",
Population01=10,
Population05=18,
Population10=20,
Population15=22
});
context.Cities.Add(new City {
Id=3,
Country="India",
Name="Bangalore",
Population01=8,
Population05=20,
Population10=25,
Population15=28
});
context.SaveChanges();
base.Seed(context);
}
}
}
Repository class
ここまで、DataContext クラスと DatabaseInitalize クラスを作成しました。リポジトリクラスでDataContextクラスを使用します。CityRepository クラスは、コア プロジェクトから ICityRepository インターフェイスを実装し、DataContext クラスを使用して CRUD 操作を実行します。CityRepository クラスは、次のリストに示すように実装できます。
using System.Collections.Generic;
using System.Linq;
using WebApiRepositoryPatternDemo.Core.Entities;
using WebApiRepositoryPatternDemo.Core.Interfaces;
namespace WebApiRepositoryPatternDemo.Infrastructure.Repository
{
public class CityRepository : ICityRepository
{
CityDataContext context = new CityDataContext();
public void Add(Core.Entities.City b)
{
context.Cities.Add(b);
context.SaveChanges();
}
public void Edit(Core.Entities.City b)
{
context.Entry(b).State = System.Data.Entity.EntityState.Modified;
}
public void Remove(string Id)
{
City b = context.Cities.Find(Id);
context.Cities.Remove(b);
context.SaveChanges();
}
public IEnumerable<Core.Entities.City> GetCity()
{
return context.Cities;
}
public Core.Entities.City FindById(int Id)
{
var c = (from r in context.Cities where r.Id == Id select r).FirstOrDefault();
return c;
}
}
}
CityRepositoryクラスの実装は非常に簡単です。通常の LINQ to Entity コードを使用して CRUD 操作を実行していることがわかります。すべてのクラスを実装した後、インフラストラクチャ プロジェクトは次の図のようになります。

Create the WebAPI project
次に、Web API プロジェクトを作成しましょう。開始するには、次の参照を追加する必要があります。
- コアプロジェクトの参照
- インフラプロジェクトの参照
- エンティティフレームワークの参照
Web API プロジェクトにすべての参照を追加したら、接続文字列 (前の手順 cityconnectionstring で追加) を APP からコピーします。インフラストラクチャ プロジェクトの構成を Web API プロジェクトの web.config に置き換えます。 次に、Global.asax ファイルを開き、Application_Start() メソッドで次のコード行を追加して、シード データがデータベースに挿入されていることを確認します。
CityDbInitalize db = new CityDbInitalize(); System.Data.Entity.Database.SetInitializer(db);
この時点で、Web API プロジェクトをビルドし、Controllers フォルダーと新しいコントローラーを右クリックします。次の図に示すように、Entity Framework オプションを使用して、アクションを含む Web API 2 コントローラーを選択し、スキャフォールディングを使用して新しいコントローラーを作成します。

次に、コントローラーを追加するには、Model クラスとして City クラスを選択し、Data コンテキスト クラスとして CityDataContext クラスを選択します。

[追加] をクリックすると、Controllers フォルダーに CitiesController という名前の Web API コントローラーが作成されていることがわかります。この時点で、Web APIを実行すると、次の画像に示すように、ブラウザで都市を取得できるはずです。

ここでは、Entity Framework CodeFirst アプローチとリポジトリ パターンを使用して Web API を作成しました。 CRUD操作は、api/cities URLに対してPOST、GET、PUT、DELETE操作を実行することで実行できます。
JQuery Client to consume Web API
それでは、都市の人口をigChartに表示しましょう。以下のリストに示すように、HTMLにIgniteUI JSおよびCSSファイルの参照を追加しました。
<title>igGrid CRUD Demo</title>
<link href="Content/Infragistics/css/themes/infragistics/infragistics.theme.css" rel="stylesheet" />
<link href="Content/Infragistics/css/structure/infragistics.css" rel="stylesheet" />
<link href="Content/bootstrap.min.css" rel="stylesheet" />
<script src="Scripts/modernizr-2.7.2.js"></script>
<script src="Scripts/jquery-2.0.3.js"></script>
<script src="Scripts/jquery-ui-1.10.3.js"></script>
<script src="Scripts/Infragistics/js/infragistics.core.js"></script>
<script src="Scripts/Infragistics/js/infragistics.dv.js"></script>
<script src="Scripts/Infragistics/js/infragistics.lob.js"></script>
<script src="Scripts/demo.js"></script>
Body要素に、以下のリストに示すようにテーブルとして追加しました。
<table>
<tr>
<td id="columnChart" class="chartElement"></td>
<td id="columnLegend" style="float: left"></td>
</tr>
</table>
jQueryのドキュメント準備完了機能でテーブルをigChartに変換するには、以下のリストに示すように、テーブルを選択してigChartに変換する必要があります。
$("#columnChart").igDataChart({
width: "98%",
height: "350px",
dataSource: "http://localhost:56649/api/Cities",
legend: { element: "columnLegend" },
title: "Cities Population",
subtitle: "Population of Indian cities",
axes: [{
name: "xAxis",
type: "categoryX",
label: "Name",
labelTopMargin: 5
}, {
name: "yAxis",
type: "numericY",
title: "in Millions",
}],
series: [{
name: "series1",
title: "2001",
type: "column",
isHighlightingEnabled: true,
isTransitionInEnabled: true,
xAxis: "xAxis",
yAxis: "yAxis",
valueMemberPath: "Population01"
}, {
name: "series2",
title: "2005",
type: "column",
isHighlightingEnabled: true,
isTransitionInEnabled: true,
xAxis: "xAxis",
yAxis: "yAxis",
valueMemberPath: "Population05"
}, {
name: "series3",
title: "2010",
type: "column",
isHighlightingEnabled: true,
isTransitionInEnabled: true,
xAxis: "xAxis",
yAxis: "yAxis",
valueMemberPath: "Population10"
},
{
name: "series4",
title: "2015",
type: "column",
isHighlightingEnabled: true,
isTransitionInEnabled: true,
xAxis: "xAxis",
yAxis: "yAxis",
valueMemberPath: "Population15"
}]
});
ここでは、チャートを作成するために次のプロパティを設定しています。
- データ・ソース・プロパティーは、HTTP GET 操作ですべての Cities 情報をフェッチするために API/Cities に設定されています
- 縦棒の凡例としてのグラフの凡例
- グラフの高さと幅
- チャートのタイトルとサブタイトル
- チャートの XAxis と YAxis
- また、次のプロパティを設定してシリーズを作成しました。
- 名前
- タイトル
- 種類
- valueMemberPath – City エンティティの数値列名に設定する必要があります。
アプリケーションを実行すると、Web API からの City データが、次の図に示すようにグラフにレンダリングされていることがわかります。

結論
これで完了です!この投稿では、リポジトリ パターンと Entity Framework コード優先アプローチを使用して Web API を作成する方法 ASP.NET 説明しました。この投稿がお役に立てば幸いです。
