<目次>
(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プロジェクトの準備
(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に設定した事で、当該エラーは解消した