チュートリアル: 最初に MVC 5 を使用して Entity Framework 6 コードの使用を開始する

Note

新しい開発では、ASP.NET MVC コントローラーとビューに対して Razor Pages を ASP.NET Coreすることをお勧めします。 Razor Pages を使用したチュートリアル シリーズについては、「チュートリアル: ASP.NET Coreでの Razor Pages の概要」を参照してください。 新しいチュートリアル:

  • 使いやすい。
  • より多くの EF Core のベスト プラクティスが提供されている。
  • より効率的なクエリを使用している。
  • より最新の API を使用している。
  • 多くの機能をカバーしている。
  • 新しいアプリケーションの開発で推奨されるアプローチである。

この一連のチュートリアルでは、データ アクセスに Entity Framework 6 を使用する ASP.NET MVC 5 アプリケーションを構築する方法について説明します。 このチュートリアルでは、Code First ワークフローを使用します。 Code First、Database First、Model First のどちらかを選択する方法については、「 モデルの作成」を参照してください。

このチュートリアル シリーズでは、Contoso University サンプル アプリケーションをビルドする方法について説明します。 サンプル アプリケーションは、簡単な大学の Web サイトです。 これを使用すると、学生、コース、インストラクターの情報を表示および更新できます。 作成する画面の 2 つを次に示します。

Students_Index_page

学生の編集

このチュートリアルでは、次の作業を行いました。

  • MVC Web アプリの作成
  • サイトのスタイルを設定する
  • Entity Framework 6 をインストールする
  • データ モデルを作成する
  • データベース コンテキストの作成
  • テスト データで DB を初期化する
  • LocalDB を使用するように EF 6 を設定する
  • コントローラーとビューを作成する
  • データベースを表示する

必須コンポーネント

MVC Web アプリの作成

  1. Visual Studio を開き、ASP.NET Web アプリケーション (.NET Framework) テンプレートを使用して C# Web プロジェクトを作成します。 プロジェクトに ContosoUniversity という名前を付け、[ OK] を選択します

    Visual Studio の [新しいプロジェクト] ダイアログ ボックス

  2. [ 新しい ASP.NET Web アプリケーション - ContosoUniversity] で、[MVC] を選択 します

    Visual Studio の [新しい Web アプリ] ダイアログ ボックス

    Note

    既定では、[ 認証 ] オプションは [認証なし] に設定されています。 このチュートリアルでは、Web アプリではユーザーがサインインする必要はありません。 また、サインインしたユーザーに基づいてアクセスが制限されることはありません。

  3. [OK] を選択すると、プロジェクトが作成されます。

サイトのスタイルを設定する

簡単な変更をいくつか行い、サイトのメニュー、レイアウト、ホーム ページを決めます。

  1. Views\Shared\_Layout.cshtml を開き、次の変更を行います。

    • "My ASP.NET アプリケーション" と "アプリケーション名" の各出現箇所を "Contoso University" に変更します。
    • 学生、コース、講師、部署のメニュー エントリを追加し、[連絡先] エントリを削除します。

    変更は、次のコード スニペットで強調表示されています。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>@ViewBag.Title - Contoso University</title>
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head>
    <body>
        <div class="navbar navbar-inverse navbar-fixed-top">
            <div class="navbar-inner">
                <div class="container">
                    <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    @Html.ActionLink("Contoso University", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
                    <div class="nav-collapse collapse">
                        <ul class="nav">
                            <li>@Html.ActionLink("Home", "Index", "Home")</li>
                            <li>@Html.ActionLink("About", "About", "Home")</li>
                            <li>@Html.ActionLink("Students", "Index", "Student")</li>
                            <li>@Html.ActionLink("Courses", "Index", "Course")</li>
                            <li>@Html.ActionLink("Instructors", "Index", "Instructor")</li>
                            <li>@Html.ActionLink("Departments", "Index", "Department")</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    
        <div class="container">
            @RenderBody()
            <hr />
            <footer>
                <p>&copy; @DateTime.Now.Year - Contoso University</p>
            </footer>
        </div>
    
        @Scripts.Render("~/bundles/jquery")
        @Scripts.Render("~/bundles/bootstrap")
        @RenderSection("scripts", required: false)
    </body>
    </html>
    
  2. Views\Home\Index.cshtml で、ファイルの内容を次のコードに置き換えて、ASP.NET と MVC に関するテキストをこのアプリケーションに関するテキストに置き換えます。

    @{
        ViewBag.Title = "Home Page";
    }
    
    <div class="jumbotron">
        <h1>Contoso University</h1>
    </div>
    <div class="row">
        <div class="col-md-4">
            <h2>Welcome to Contoso University</h2>
            <p>Contoso University is a sample application that
            demonstrates how to use Entity Framework 6 in an 
            ASP.NET MVC 5 web application.</p>
        </div>
        <div class="col-md-4">
            <h2>Build it from scratch</h2>
            <p>You can build the application by following the steps in the tutorial series on the ASP.NET site.</p>
            <p><a class="btn btn-default" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/">See the tutorial &raquo;</a></p>
        </div>
        <div class="col-md-4">
            <h2>Download it</h2>
            <p>You can download the completed project.</p>
            <p><a class="btn btn-default" href="https://webpifeed.blob.core.windows.net/webpifeed/Partners/ASP.NET%20MVC%20Application%20Using%20Entity%20Framework%20Code%20First.zip">Download &raquo;</a></p>
        </div>
    </div>
    
  3. Ctrl + F5 キーを押して Web サイトを実行します。 メイン メニューが表示されたホーム ページが表示されます。

Entity Framework 6 をインストールする

  1. [ツール] メニューの [NuGet パッケージ マネージャー] を選択し、[パッケージ マネージャー コンソール] を選択します。

  2. [パッケージ マネージャー コンソール] ウィンドウで、次のコマンドを入力します。

    Install-Package EntityFramework
    

この手順は、このチュートリアルで手動で行ったいくつかの手順のうちの 1 つですが、これは、ASP.NET MVC スキャフォールディング機能によって自動的に行われる可能性があります。 Entity Framework (EF) を使用するために必要な手順を確認できるように、手動で実行しています。 スキャフォールディングを後で使用して、MVC コントローラーとビューを作成します。 別の方法として、スキャフォールディングによって EF NuGet パッケージが自動的にインストールされ、データベース コンテキスト クラスが作成され、接続文字列が作成されます。 そのようにする準備ができたら、これらの手順をスキップし、エンティティ クラスを作成した後で MVC コントローラーをスキャフォールディングする必要があります。

データ モデルの作成

次に、Contoso University アプリケーションのエンティティ クラスを作成します。 次の 3 つのエンティティから始めます。

コース<->Enrollment-Student<>

エンティティ リレーションシップ
コースから登録 一対多
学生から登録へ 一対多

Student エンティティと Enrollment エンティティの間に一対多の関係があり、Course エンティティと Enrollment エンティティの間に一対多の関係があります。 言い換えると、1 人の学生をさまざまな講座に登録し、1 つの講座にたくさんの学生を登録できます。

次のセクションでは、これらのエンティティごとにクラスを作成します。

Note

これらのエンティティ クラスの作成をすべて完了する前にプロジェクトをコンパイルしようとすると、コンパイラ エラーが発生します。

Student エンティティ

  • Models フォルダーでStudent.cs という名前のクラス ファイルを作成します。ソリューション エクスプローラー内のフォルダーを右クリックし、[クラス追加]> を選択します。 テンプレート コードを次のコードに置き換えます。

    using System;
    using System.Collections.Generic;
    
    namespace ContosoUniversity.Models
    {
        public class Student
        {
            public int ID { get; set; }
            public string LastName { get; set; }
            public string FirstMidName { get; set; }
            public DateTime EnrollmentDate { get; set; }
            
            public virtual ICollection<Enrollment> Enrollments { get; set; }
        }
    }
    

ID プロパティは、このクラスに相当するデータベース テーブルの主キー列になります。 既定では、Entity Framework は、 または classnameID という名前IDのプロパティを主キーとして解釈します。

Enrollments プロパティはナビゲーション プロパティです。 ナビゲーション プロパティには、このエンティティに関連する他のエンティティが含まれます。 この場合、Enrollmentsエンティティの Student プロパティには、そのStudentエンティティにEnrollment関連するすべてのエンティティが保持されます。 言い換えると、データベース内の特定 Student の行に 2 つの関連 Enrollment 行 (外部キー列にその学生の主キー値を StudentID 含む行) がある場合、その Student エンティティの Enrollments ナビゲーション プロパティには、これら 2 つの Enrollment エンティティが含まれます。

ナビゲーション プロパティは、通常、遅延読み込みなどの特定の Entity Framework 機能を利用できるように としてvirtual定義されます。 (遅延読み込みについては、このシリーズの後半の 「関連データの読み取り 」チュートリアルで後ほど説明します)。

ナビゲーション プロパティに複数のエンティティが含まれる場合 (多対多または一対多の関係で)、その型はリストにする必要があります。ICollection のように、エンティティを追加、削除、更新できるリストです。

Enrollment エンティティ

  • [Models] フォルダーで、Enrollment.cs を作成し、既存のコードを次のコードに変更します。

    namespace ContosoUniversity.Models
    {
        public enum Grade
        {
            A, B, C, D, F
        }
    
        public class Enrollment
        {
            public int EnrollmentID { get; set; }
            public int CourseID { get; set; }
            public int StudentID { get; set; }
            public Grade? Grade { get; set; }
            
            public virtual Course Course { get; set; }
            public virtual Student Student { get; set; }
        }
    }
    

プロパティはEnrollmentID主キーになります。このエンティティでは、エンティティで見たとおり、それ自体ではなくIDクラス名IDパターンがStudent使用されます。 通常、パターンを 1 つ選択し、データ モデル全体でそれを使用します。 ここのバリエーションから、いずれのパターンも利用できることがわかります。 後のチュートリアルでは、 を 使用IDclassnameすると、データ モデルに継承を実装しやすくする方法について説明します。

プロパティはGrade列挙型ですGrade の型宣言の後の疑問符は、Grade プロパティが nullable であることを示します。 null の成績は 0 の成績とは異なります。null は、成績が不明であるか、まだ割り当てられていないことを意味します。

StudentID プロパティは外部キーです。それに対応するナビゲーション プロパティは Student です。 Enrollment エンティティは 1 つの Student エンティティに関連付けられており、1 つの Student エンティティだけを保持できます (先に見た、複数の Enrollment エンティティを保持できる Student.Enrollments ナビゲーション プロパティとは異なります)。

CourseID プロパティは外部キーです。それに対応するナビゲーション プロパティは Course です。 Enrollment エンティティは 1 つの Course エンティティに関連付けられます。

Entity Framework は、ナビゲーション プロパティ名の主キー プロパティ名<>< (エンティティの主キー>が であるためStudentナビゲーション プロパティの場合など) の場合、 StudentIDStudentプロパティを外部キー IDプロパティとして解釈します。 外部キー プロパティには、単に<主キー プロパティ名と同じ名前>を付けることもできます (たとえば、CourseIDエンティティの主キーは であるためCourse)。CourseID

Course エンティティ

  • Models フォルダーで Course.cs を作成し、テンプレート コードを次のコードに置き換えます。

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace ContosoUniversity.Models
    {
        public class Course
        {
            [DatabaseGenerated(DatabaseGeneratedOption.None)]
            public int CourseID { get; set; }
            public string Title { get; set; }
            public int Credits { get; set; }
            
            public virtual ICollection<Enrollment> Enrollments { get; set; }
        }
    }
    

Enrollments プロパティはナビゲーション プロパティです。 1 つの Course エンティティにたくさんの Enrollment エンティティを関連付けることができます。

DatabaseGeneratedAttribute 属性については、このシリーズの後のチュートリアルで詳しく学習します。 基本的に、この属性によって、講座の主キーをデータベースに生成させず、自分で入力できるようになります。

データベース コンテキストの作成

特定のデータ モデルの Entity Framework 機能を調整するメイン クラスは、データベース コンテキスト クラスです。 このクラスは、 System.Data.Entity.DbContext クラスから派生して作成します。 コードでは、データ モデルに含めるエンティティを指定します。 Entity Framework の特定の動作をカスタマイズすることもできます。 このプロジェクトでは、クラスに SchoolContext という名前が付けられています。

  • ContosoUniversity プロジェクトにフォルダーを作成するには、ソリューション エクスプローラーでプロジェクトを右クリックし、[追加] をクリックし、[新しいフォルダー] をクリックします。 新しいフォルダーに DAL という名前を付けます (データ アクセス層の場合)。 そのフォルダーに SchoolContext.cs という名前の新しいクラス ファイルを作成し、テンプレート コードを次のコードに置き換えます。

    using ContosoUniversity.Models;
    using System.Data.Entity;
    using System.Data.Entity.ModelConfiguration.Conventions;
    
    namespace ContosoUniversity.DAL
    {
        public class SchoolContext : DbContext
        {
        
            public SchoolContext() : base("SchoolContext")
            {
            }
            
            public DbSet<Student> Students { get; set; }
            public DbSet<Enrollment> Enrollments { get; set; }
            public DbSet<Course> Courses { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            }
        }
    }
    

エンティティ セットを指定する

このコードでは、各エンティティ セットの DbSet プロパティを作成します。 Entity Framework の用語では、 通常、エンティティ セット はデータベース テーブルに対応し、 エンティティ はテーブル内の行に対応します。

Note

ステートメントと DbSet<Course> ステートメントをDbSet<Enrollment>省略すると、同じように動作します。 エンティティがエンティティを参照し、エンティティがエンティティをStudentEnrollment参照するため、EnrollmentEntity Framework には暗黙的にCourse含まれます。

接続文字列を指定する

接続文字列の名前 (後でWeb.config ファイルに追加します) がコンストラクターに渡されます。

public SchoolContext() : base("SchoolContext")
{
}

また、Web.config ファイルに格納されている名前ではなく、接続文字列自体を渡すこともできます。 使用するデータベースを指定するためのオプションの詳細については、「 接続文字列とモデル」を参照してください。

接続文字列または接続文字列の名前を明示的に指定しない場合、Entity Framework は接続文字列名がクラス名と同じであると見なします。 この例の既定の接続文字列名は、明示的に指定するのと同じ になります SchoolContext

単一のテーブル名を指定する

OnModelCreating メソッドの ステートメントはmodelBuilder.Conventions.Remove、テーブル名が複数形化されないようにします。 これを行わない場合、データベース内で生成されたテーブルの名前 Studentsは 、、 Coursesおよび Enrollmentsになります。 代わりに、テーブル名は、、Course、および EnrollmentになりますStudent。 テーブル名を複数形にするかどうかについては、開発者の間で意見が分かれるでしょう。 このチュートリアルでは単数形を使用しますが、重要な点は、このコード行を含めたり省略したりして、任意のフォームを選択できることです。

テスト データで DB を初期化する

Entity Framework では、アプリケーションの実行時にデータベースを自動的に作成 (または削除して再作成) できます。 これは、アプリケーションが実行されるたびに、またはモデルが既存のデータベースと同期していない場合にのみ実行されるように指定できます。 また、Entity Framework がデータベースの Seed 作成後に自動的に呼び出すメソッドを記述して、テスト データを設定することもできます。

既定の動作では、データベースが存在しない場合にのみデータベースを作成します (モデルが変更され、データベースが既に存在する場合は例外をスローします)。 このセクションでは、モデルが変更されるたびにデータベースを削除して再作成することを指定します。 データベースを削除すると、すべてのデータが失われます。 通常、このメソッドはデータベースの再作成時に実行され、テスト データが再作成されるため Seed 、開発中は問題ありません。 ただし、運用環境では、通常、データベース スキーマを変更する必要があるたびにすべてのデータを失いたくはありません。 後で、データベースを削除して再作成するのではなく、Code First Migrationsを使用してデータベース スキーマを変更することで、モデルの変更を処理する方法について説明します。

  1. DAL フォルダーで、 SchoolInitializer.cs という名前の新しいクラス ファイルを作成し、テンプレート コードを次のコードに置き換えます。これにより、必要に応じてデータベースが作成され、テスト データが新しいデータベースに読み込まれます。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using ContosoUniversity.Models;
    
    namespace ContosoUniversity.DAL
    {
        public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext>
        {
            protected override void Seed(SchoolContext context)
            {
                var students = new List<Student>
                {
                new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")},
                new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")},
                new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")}
                };
    
                students.ForEach(s => context.Students.Add(s));
                context.SaveChanges();
                var courses = new List<Course>
                {
                new Course{CourseID=1050,Title="Chemistry",Credits=3,},
                new Course{CourseID=4022,Title="Microeconomics",Credits=3,},
                new Course{CourseID=4041,Title="Macroeconomics",Credits=3,},
                new Course{CourseID=1045,Title="Calculus",Credits=4,},
                new Course{CourseID=3141,Title="Trigonometry",Credits=4,},
                new Course{CourseID=2021,Title="Composition",Credits=3,},
                new Course{CourseID=2042,Title="Literature",Credits=4,}
                };
                courses.ForEach(s => context.Courses.Add(s));
                context.SaveChanges();
                var enrollments = new List<Enrollment>
                {
                new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},
                new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},
                new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},
                new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},
                new Enrollment{StudentID=3,CourseID=1050},
                new Enrollment{StudentID=4,CourseID=1050,},
                new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},
                new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},
                new Enrollment{StudentID=6,CourseID=1045},
                new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},
                };
                enrollments.ForEach(s => context.Enrollments.Add(s));
                context.SaveChanges();
            }
        }
    }
    

    メソッドは Seed データベース コンテキスト オブジェクトを入力パラメーターとして受け取ります。メソッドのコードでは、そのオブジェクトを使用して新しいエンティティをデータベースに追加します。 エンティティの種類ごとに、新しいエンティティのコレクションを作成し、適切な DbSet プロパティに追加してから、変更をデータベースに保存します。 ここでは、エンティティの各グループの後に メソッドを呼び出す SaveChanges 必要はありませんが、これを行うと、コードがデータベースに書き込んでいる間に例外が発生した場合に問題の原因を特定するのに役立ちます。

  2. 初期化子クラスを使用するように Entity Framework に指示するには、次の例に entityFramework 示すように、アプリケーション Web.config ファイル内の 要素 (ルート プロジェクト フォルダー内の要素) に 要素を追加します。

    <entityFramework>
      <contexts>
        <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">
          <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />
        </context>
      </contexts>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
          <parameter value="v11.0" />
        </parameters>
      </defaultConnectionFactory>
      <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      </providers>
    </entityFramework>
    

    context type 、完全修飾コンテキスト クラス名とそのアセンブリを指定し databaseinitializer type 、 は初期化子クラスとそのアセンブリの完全修飾名を指定します。 (EF で初期化子を使用しない場合は、 要素に属性を context 設定できます。 disableDatabaseInitialization="true"詳細については、「 構成ファイルの設定」を参照してください。

    Web.config ファイルで初期化子を設定する代わりに、Global.asax.cs ファイルの メソッドに Application_Start ステートメントを追加Database.SetInitializerしてコード内で設定することもできます。 詳細については、「 Entity Framework Code First のデータベース初期化子について」を参照してください。

アプリケーションがセットアップされ、アプリケーションの特定の実行で初めてデータベースにアクセスすると、Entity Framework によってデータベースがモデル (および SchoolContext エンティティ クラス) と比較されます。 違いがある場合、アプリケーションはデータベースを削除して再作成します。

Note

運用 Web サーバーにアプリケーションをデプロイする場合は、データベースを削除して再作成するコードを削除または無効にする必要があります。 これは、このシリーズの後のチュートリアルで行います。

LocalDB を使用するように EF 6 を設定する

LocalDB は、SQL Server Express データベース エンジンの軽量バージョンです。 インストールと構成が簡単で、オンデマンドで開始され、ユーザー モードで実行されます。 LocalDB は、データベースを .mdf ファイルとして操作できるSQL Server Expressの特別な実行モードで実行されます。 LocalDB データベース ファイルは、プロジェクトと共にデータベースをコピーできるようにする場合は、Web プロジェクトの App_Data フォルダーに配置できます。 SQL Server Expressのユーザー インスタンス機能では、.mdf ファイルを操作することもできますが、ユーザー インスタンス機能は非推奨です。そのため、.mdf ファイルの操作には LocalDB をお勧めします。 LocalDB は、Visual Studio と共に既定でインストールされます。

通常、SQL Server Expressは運用 Web アプリケーションには使用されません。 特に LocalDB は、IIS で動作するように設計されていないため、Web アプリケーションでの運用環境での使用にはお勧めしません。

  • このチュートリアルでは、LocalDB を使用します。 次の例に示すように、アプリケーション Web.config ファイルを開き、 要素のappSettings前に 要素を追加connectionStringsします。 (ルート プロジェクト フォルダー内の Web.config ファイルを必ず更新してください。また、更新する必要のない Web.config ファイルが Views サブフォルダーにあります)。

    <connectionStrings>
        <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <appSettings>
      <add key="webpages:Version" value="3.0.0.0" />
      <add key="webpages:Enabled" value="false" />
      <add key="ClientValidationEnabled" value="true" />
      <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    </appSettings>
    

追加した接続文字列は、Entity Framework で ContosoUniversity1.mdf という名前の LocalDB データベースを使用することを指定します。 (データベースはまだ存在しませんが、EF によって作成されます)。 App_Data フォルダーにデータベースを作成する場合は、接続文字列に を追加 AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf できます。 接続文字列の詳細については、「ASP.NET Web アプリケーションのSQL Server接続文字列」を参照してください。

実際には、 Web.config ファイルに接続文字列は必要ありません。 接続文字列を指定しない場合、Entity Framework ではコンテキスト クラスに基づいて既定の接続文字列が使用されます。 詳細については、「 Code First to a New Database」を参照してください。

コントローラーとビューを作成する

次に、データを表示する Web ページを作成します。 データを要求するプロセスによって、データベースの作成が自動的にトリガーされます。 まず、新しいコントローラーを作成します。 ただし、その前にプロジェクトをビルドして、モデルとコンテキスト クラスを MVC コントローラー スキャフォールディングで使用できるようにします。

  1. ソリューション エクスプローラーControllers フォルダーを右クリックし、[追加] を選択し、[新しいスキャフォールディングされた項目] をクリックします。

  2. [ スキャフォールディングの追加 ] ダイアログ ボックス で、[Entity Framework を使用してビューを含む MVC 5 コントローラー] を選択し、[ 追加] を選択します。

    Visual Studio の [スキャフォールディングの追加] ダイアログ

  3. [ コントローラーの追加 ] ダイアログ ボックスで、次の選択を行い、[ 追加] を選択します。

    • モデル クラス: Student (ContosoUniversity.Models)。 (ドロップダウン リストにこのオプションが表示されない場合は、プロジェクトをビルドして、もう一度やり直してください)。

    • データ コンテキスト クラス: SchoolContext (ContosoUniversity.DAL)

    • コントローラー名: StudentController (StudentsController ではありません)。

    • 他のフィールドの既定値のままにします。

      [追加] をクリックすると、スキャフォールディングによって StudentController.cs ファイルと、コントローラーで動作する一連のビュー (.cshtml ファイル) が作成されます。 今後、Entity Framework を使用するプロジェクトを作成するときに、スキャフォールディングのいくつかの追加機能を利用することもできます。最初のモデル クラスを作成し、接続文字列を作成せず、[コントローラーの追加] ボックスで [データ コンテキスト クラス] の横にあるボタンを+選択して [新しいデータ コンテキスト] を指定します。 スキャフォールディングによって、クラスと接続文字列、およびコントローラーとビューが作成 DbContext されます。

  4. Visual Studio によって Controllers\StudentController.cs ファイルが 開きます。 データベース コンテキスト オブジェクトをインスタンス化するクラス変数が作成されていることがわかります。

    private SchoolContext db = new SchoolContext();
    

    アクション メソッドはIndex、データベース コンテキスト インスタンスの プロパティを読み取Studentsることによって、Students エンティティ セットから学生の一覧を取得します。

    public ViewResult Index()
    {
        return View(db.Students.ToList());
    }
    

    Student\Index.cshtml ビューでは、次の一覧がテーブルに表示されます。

    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.LastName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FirstMidName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.EnrollmentDate)
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstMidName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EnrollmentDate)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.ID })
            </td>
        </tr>
    }
    
  5. Ctrl キーを押しながら F5 キーを押してプロジェクトを実行します。 ("シャドウ コピーを作成できません" というエラーが表示された場合は、ブラウザーを閉じてからやり直してください)。

    [ 学生 ] タブをクリックすると、メソッドが挿入したテスト データが Seed 表示されます。 ブラウザー ウィンドウの幅に応じて、上部のアドレス バーに [学生] タブ リンクが表示されるか、右上隅をクリックしてリンクを表示する必要があります。

    メニュー ボタン

データベースを表示する

[学生] ページを実行し、アプリケーションがデータベースにアクセスしようとすると、EF はデータベースがないことを検出し、データベースを作成しました。 次に、EF は seed メソッドを実行して、データベースにデータを設定しました。

Server エクスプローラー または SQL Server オブジェクト エクスプローラー (SSOX) を使用して、Visual Studio でデータベースを表示できます。 このチュートリアルでは、Server エクスプローラーを使用します

  1. ブラウザーを閉じます。

  2. [サーバー エクスプローラー] で、[データ接続] を展開します (最初に [更新] ボタンを選択する必要がある場合があります)、[学校コンテキスト (ContosoUniversity)] の順に展開し、[テーブル] を展開して新しいデータベース内のテーブルを表示します。

  3. Student テーブルを右クリックし、[テーブル データの表示] をクリックすると、作成された列とテーブルに挿入された行が表示されます。

  4. サーバーエクスプローラー接続を閉じます。

ContosoUniversity1.mdf および .ldf データベース ファイルは、%USERPROFILE% フォルダーにあります。

初期化子を DropCreateDatabaseIfModelChanges 使用しているため、 クラスに Student 変更を加え、アプリケーションをもう一度実行すると、変更に合わせてデータベースが自動的に再作成されます。 たとえば、クラスに プロパティを EmailAddress 追加し Student 、[学生] ページをもう一度実行し、テーブルをもう一度見ると、新 EmailAddress しい列が表示されます。

規約

Entity Framework が完全なデータベースを作成できるようにするために記述する必要があるコードの量は、 規則や Entity Framework が行う前提のため最小限です。 それらの一部は、既に注意されているか、それらを認識せずに使用されています。

  • 複数形のエンティティ クラス名は、テーブル名として使用されます。
  • 列名には、エンティティ プロパティ名が使用されます。
  • 名前 ID または クラス名ID のエンティティ プロパティは、主キー プロパティとして認識されます。
  • <ナビゲーション プロパティ名><主キー プロパティ名> という名前 (たとえば、Student ナビゲーション プロパティの場合、Student エンティティの主キーが ID なので、StudentID となります) が付いている場合、プロパティは外部キー プロパティとして解釈されます。 外部キー プロパティには、単に<主キー プロパティ名と同じ名前>を付けることもできます (たとえば、EnrollmentIDエンティティの主キーは であるためEnrollment)。EnrollmentID

規則をオーバーライドできることを確認しました。 たとえば、テーブル名を複数形化しないように指定し、後でプロパティを外部キー プロパティとして明示的にマークする方法を確認します。

コードを取得する

完成したプロジェクトのダウンロード

その他のリソース

EF 6 の詳細については、次の記事を参照してください。

次の手順

このチュートリアルでは、次の作業を行いました。

  • MVC Web アプリを作成しました
  • サイトのスタイルを設定する
  • インストールされている Entity Framework 6
  • データ モデルを作成した
  • データベース コンテキストを作成した
  • テスト データで DB を初期化した
  • LocalDB を使用するように EF 6 を設定する
  • コントローラーとビューを作成した
  • データベースを表示した

次の記事に進み、コントローラーとビューの作成、読み取り、更新、削除 (CRUD) コードを確認してカスタマイズする方法について説明します。