Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

ASP.NET

Entity Frameworkの使い方や導入手順をご紹介

投稿日:2021年6月4日 更新日:

 

<目次>

(1) Entity Frameworkの使い方や導入手順をご紹介
 (1-1) 前提条件
 (1-2) STEP0:ASP:NET MVCプロジェクトの準備
 (1-3) STEP1:Entity Frameworkのインストール
 (1-4) STEP2:データモデル(エンティティ)の定義
 (1-5) STEP3:コンテキストの定義
 (1-6) STEP4:DB接続用のconfig設定(web.config)
 (1-7) STEP5:Entity Frameworkのインストール
 (1-8) STEP6:イニシャライザーをアプリケーションに登録
 (1-9) STEP7:コントローラー/ビューの追記
 (1-10) STEP8:プログラム実行
 (1-11) エラー対処

(1) Entity Frameworkの使い方や導入手順をご紹介

(1-1) 前提条件

SQLServerのインストールが済んでいる事

(手順)SQLServer Expressエディションのインストール手順

目次にもどる

(1-2) STEP0:ASP:NET MVCプロジェクトの準備

ASP.NET MVCプロジェクト(Webアプリ)において、EntityFrameworkによるエンティティを介したデータベースアクセスを実現するためには、前提条件として土台となるASP.NET MVCプロジェクトでHelloWorldが出来ている事(最低限のControllerとViewで画面が開ける)を前提条件とします。
 
ASP.NET MVCのHelloWorldの手順については、別途こちらで紹介していますので、まだの方はご覧いただけたらと思います。
 
 

(1-3) STEP1:Entity Frameworkのインストール

・①VisualStudioで「ツール」⇒「Nugetパッケージマネージャー」⇒「ソリューションのNuGetパッケージの管理」と選択します

(図111)

・②Nuget画面で「EntityFramework」と検索&選択して、対象プロジェクトを選んで「インストール」を押下します。

(図112)

・③「変更のプレビュー」や「ライセンスへの同意」画面が出ますが、問題なければそのまま進行させます。
(図113)

(図114)

・④「正常にインストールされました」の文言が表示される事を確認します。

'EntityFramework 6.4.4' が EntityFrameworkTest に正常にインストールされました
NuGet の操作の実行に 10.38 sec かかりました
経過した時間: 00:00:12.6676378

(図115)

(参考)コマンドでもインストール可能
別のインストール方法として、コマンドでもインストールできます。

・①VisualStudioで「ツール」⇒「Nugetパッケージマネージャー」⇒「パッケージマネージャーコンソール」
(図116)

・②コンソールに次のコマンドを入力します。

Install-Package EntityFramework

(図117)

目次にもどる

(1-4) STEP2:データモデル(エンティティ)の定義

エンティティ」はテーブルとアプリケーション側のオブジェクトの中間に位置するようなモデル(概念モデル)を表します。

(エンティティ追加手順)
・ソリューションエクスプローラーでModelsフォルダを右クリックして「追加」⇒「クラス」を選択
(図121)

(図122)

・「新しい項目の追加」ダイアログで「クラス」を選択し、任意のModel名を入力して「追加」を押下します。
(図123)

・以下のサンプルコードを追記します。フルーツの情報(名前、価格、原産地など)保持するモデルです。

(サンプル)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace EntityFrameworkTest.Models
{
    public class Fruit
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }
        public string Origin { get; set; }
        public DateTime HarvestDate { get; set; }

    }
}

(図124)

目次にもどる

(1-5) STEP3:コンテキストの定義

次に先程のデータモデル(エンティティ)クラスから、データベースに接続して各種処理(データの取得・更新)する際の仲介を行う「コンテキスト」クラスの定義を行います。

コンテキストクラスの作成方法としては「DbContext」クラスを継承して、その中でDbSetプロパティ(DBのテーブル相当)を公開する方法が一般的です。箇条書きで書くと以下の通りです。

(条件)
・DbContextクラスを継承する事(System.Data.Entity)
・DbSet<[Modelクラス名]>型のpublic型のプロパティを用意する

こちらもデータモデルの時と同様に、通常のクラスとして作成します。以下はModel「Fruit」の場合の例です。

(サンプル)

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace EntityFrameworkTest.Models
{
    public class MvcContext : DbContext
    {
        public DbSet Fruits { get; set; }
    }
}

 

(図131)

(参考)
DbSetはEntityFrameworkのSystem.Data.Entity名前空間のクラスであるため、この時点でEntityFrameworkがインストールされていないとエラーになります。

(図132)

目次にもどる

(1-6) STEP4:DB接続用のconfig設定(web.config)

データベースに接続するためには接続情報をWeb.configに記述する必要があります。Web.configはデフォルトではプロジェクト(例:EntityFrameworkTest)の直下にあります。

(図141)

以下は追記内容のサンプルです。

(サンプル)

 <connectionStrings>
    <add name="MvcContext" connectionString="Data Source=localhost;Initial Catalog=rainbowdb;Integrated Security=False;User Id=SA;Password=Tatsuya0813" providerName="System.Data.SqlClient" />
</connectionStrings>

(図142)

各項目の意味合いは次の通りです。
(表1)

name 「接続名」を指定します。
(例)
name=”MvcContext”
connectionString 「接続文字列」を指定します。具体的には(表2)で記載の項目のうち、必要な値をセミコロンで繋いで記述します。
(例)
connectionString=”Data Source=localhost;Initial Catalog=rainbowdb;Integrated Security=True”
providerName SqlDataSourceで使用するデータプロバイダ(データベースからデータを提供するフレームワークのようなもの)の名称を指定します。
(例)
providerName=”System.Data.OleDb”
providerName=”System.Data.SqlClient”

(表2)

Data Source 接続先のSQL Serverが属する「ホスト名」を指定します。
(例)
Data Source=localhost;
Initial Catalog 接続先のデータベース名を指定します。
(例)
Initial Catalog=rainbowdb;
Integrated Security 認証の方式をboolean型で指定するパラメータで、各値は次の意味になります。
trueの場合:Windows認証
falseの場合:SQL Server認証
もしfalseでSQL Server認証を使用する場合は、その後ろに「User ID」や「Password」を併せて指定します。
User Id SQL Server認証の「ユーザーID」を指定します。
Password SQL Server認証の「パスワード」を指定します。

目次にもどる

(1-7) STEP5:Entity Frameworkのインストール

イニシャライザーはモデルに変更等が発生した場合に、どのようにデータベースを生成・更新するか?を定義するものです。Entity Frameworkにはその方式が4つ程あり、状況によって使い分ける事ができます。

・①CreateDatabaseIfNotExists<TContext>
データベースが存在しない場合、CREATEします。

・②DropCreateDatabaseAlways<TContext>
常にデータベースをCREATEします。もし既に存在する場合、一度DROPして再度CREATEします。

・③DropCreateDatabaseIfModelChanges<TContext>
モデルに変更があった場合のみデータベースをCREATEします。

・④カスタムのイニシャライザー
上記3パターンのいずれも要件を満たさない場合はカスタムで作成できるものです。

こちらもデータモデルの時と同様に、通常のクラスとして作成します。今回は②(DropCreateDatabaseAlways)の方式の例をご紹介します。

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace EntityFrameworkTest.Models
{
    public class MvcInitializer : DropCreateDatabaseAlways<MvcContext>
    {
        protected override void Seed(MvcContext context)
        {
            var fruits = new List<Fruit>
            {
                new Fruit
                {
                    Id = "A001",
                    Name = "Apple",
                    Price = 200,
                    Origin = "Aomori",
                    HarvestDate = DateTime.Parse("2021-03-23")
                },
                new Fruit
                {
                    Id = "A002",
                    Name = "Banana",
                    Price = 120,
                    Origin = "India",
                    HarvestDate = DateTime.Parse("2021-03-24")
                }
            };
            fruits.ForEach(fr => context.Fruits.Add(fr));
            context.SaveChanges();
        }
    }
}

(図151)

目次にもどる

(1-8) STEP6:イニシャライザーをアプリケーションに登録

次に作成したイニシャライザーがアプリケーションの起動時に呼び出されるようにGlobal.asaxに登録します。Global.asaxはシステムレベルのイベント(アプリケーションの起動/停止、セッション管理、エラー時の汎用対応など)を定義するための定義ファイルです。

ファイルはデフォルトで生成されており、今回追記するのは「▲」印の箇所のみです。

using EntityFrameworkTest.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace EntityFrameworkTest
{
    public class MvcApplication : System.Web.HttpApplication
    {
        //# アプリケーション起動時に実行される処理を登録
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            //# ▲追記した行
            //# 先ほど作成したイニシャライザを登録
            Database.SetInitializer<MvcContext>(new MvcInitializer());
        }
    }
}

(図161)

目次にもどる

(1-9) STEP7:コントローラー/ビューの追記

次はいよいよ、(STEP0)で作成したASP.NET MVCプロジェクトのControllerとViewに対して、EntityFrameworkで取得したデータを表示できるように追記していきます。

●Controller

using EntityFrameworkTest.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace EntityFrameworkTest.Controllers
{
    public class HomeController : Controller
    {
        private MvcContext db = new MvcContext();

        // GET: Home
        public ActionResult Index()
        {
            return View(db.Fruits);
        }
    }
}

 

(図171)

●View

@model IEnumerable<MvcModelTest3.Models.Fruit>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <table>
        @foreach (var fruit in Model)
        {
        <tr>
            <td>@fruit.Id</td>
            <td>@fruit.Name</td>
            <td>@fruit.Price</td>
            <td>@fruit.Origin</td>
            <td>@fruit.HarvestDate</td>
        </tr>
        }
    </table>
</body>
</html>

 

(図172)

目次にもどる

(1-10) STEP8:プログラム実行

最後にアプリケーションをIIS Expressから実行し、データベースが作成(CREATE)されてレコードが登録(INSERT)されている事を確認します。

(図181)実行前

(図182)実行後

SQL Server(左側)を見ると、データベース(rainbowdb)が追加され、更にModelのデータを格納したテーブルである「Fruits」テーブルが生成され、更にイニシャライザーでセットしたレコードが登録されている事を確認します。

(動画)
参考に、実行してからDB作成⇒テーブル作成⇒レコード登録までの流れを確認する動画を掲載します。

【※注意】サーバのスペックが低く、処理が非常に遅いので、適宜早送りしながら見て頂けたらと思います。

目次にもどる

(1-11) エラー対処

エラーCS0234 型または名前空間の名前 ‘Entity’ が名前空間 ‘System.Data’ に存在しません (アセンブリ参照があることを確認してください)。

(エラーメッセージ)

エラーCS0234 型または名前空間の名前 'Entity' が名前空間 'System.Data' に存在しません (アセンブリ参照があることを確認してください)。

(図191)

(対処例)
⇒Entity Frameworkをインストールしたら解消した

目次にもどる

Web プロジェクト ‘XXXX’ に必要なSQL Server 2012 Express LoacalDBがこのコンピュータにインストールされていません。

(エラーメッセージ)

Web プロジェクト 'XXXX' に必要なSQL Server 2012 Express LoacalDBがこのコンピュータにインストールされていません。

(対処例)
⇒イニシャライザ含め実行したら、当該エラーは解消した

目次にもどる

[Win32Exception (0x80004005): パラメーターが間違っています。]

(エラーメッセージ)

[SqlException (0x80131904): SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 (provider: SQL Network Interfaces, error: 25 - 接続文字列が有効ではありません)]

(図193)

(対処例)
⇒connectionStringのData Sourceをlocalhostに設定した事で、当該エラーは解消した

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-ASP.NET

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

ASP.NETの単体テストプロジェクトを新規に作成する方法

<目次> (1) ASP.NETの単体テストプロジェクトを新規に作成する方法  (1-1) ASP.NET MVCにおける単体テスト機能について  (1-2) ASP.NET MVCにおける単体テスト …

ASP.NET MVCのRouteConfigを追加する方法を2つご紹介

  <目次> (1) ASP.NET MVCのRouteConfigを追加する方法を2つご紹介  (1-1) やりたい事の整理  (1-2) 方法1:通常のルーティング  (1-3) 方法2 …

ASP.NET MVCのルーティングの基本

<目次> (1) ASP.NET MVCのルーティングの基本  (1-1) 構文  (1-2) サンプルプログラム   ・RouteConfig.cs   ・Controller   ・View  ( …

ASP.NETのActionResultの戻り値の種類について

  <目次> (1) ASP.NETのActionResultの戻り値の種類について  (1-1) はじめに  (1-2) ASP.NETのActionResultの戻り値の種類  (1-3 …

ASP.NETの既存プロジェクトに単体テストプロジェクトを追加する手順

<目次> (1) ASP.NETの既存プロジェクトに単体テストプロジェクトを追加する手順  (1-1) 新規プロジェクトを作成  (1-2) 参照の追加  (1-3) 単体テスト用のコードの記述  ( …

  • English (United States)
  • 日本語
Top