教學課程:開始使用 Entity Framework 6 Code First using MVC 5

注意

針對新的開發,建議您透過 ASP.NET MVC 控制器和檢視ASP.NET Core Razor Pages。 如需類似這一個使用 Razor Pages 的教學課程系列,請參閱教學課程:開始使用 ASP.NET Core 中的 Razor 頁面。 新的教學課程:

  • 比較容易學習。
  • 提供更多 EF Core 最佳做法。
  • 使用更有效率的查詢。
  • 具有最新的 API。
  • 涵蓋更多功能。
  • 是新應用程式開發的建議方法。

在本系列教學課程中,您將瞭解如何建置使用 Entity Framework 6 進行資料存取的 ASP.NET MVC 5 應用程式。 本教學課程使用 Code First 工作流程。 如需如何在 Code First、Database First 和 Model First 之間選擇的資訊,請參閱 建立模型

本教學課程系列說明如何建置 Contoso University 範例應用程式。 範例應用程式是簡單的大學網站。 您可以使用它來檢視及更新學生、課程和講師資訊。 以下是您建立的兩個畫面:

Students_Index_page

編輯學生

在本教學課程中,您:

  • 建立 MVC web 應用程式
  • 設定網站樣式
  • 安裝 Entity Framework 6
  • 建立資料模型
  • 建立資料庫內容
  • 使用測試資料將 DB 初始化
  • 設定 EF 6 以使用 LocalDB
  • 建立控制器和檢視
  • 檢視資料庫

必要條件

建立 MVC web 應用程式

  1. 開啟 Visual Studio,並使用ASP.NET Web 應用程式 (.NET Framework) 範本建立 C# Web 專案。 將專案命名為 ContosoUniversity ,然後選取 [ 確定]。

    Visual Studio 中的 [新增專案] 對話方塊

  2. [新增 ASP.NET Web 應用程式 - ContosoUniversity] 中,選取 [MVC]。

    Visual Studio 中的 [新增 Web 應用程式] 對話方塊

    注意

    根據預設, [驗證 ] 選項會設定為 [無驗證]。 在本教學課程中,Web 應用程式不需要使用者登入。 此外,它不會根據登入的人員來限制存取。

  3. 選取 [確定] 可建立專案。

設定網站樣式

一些簡單的變更會設定網站的功能表、配置和首頁。

  1. 開啟 Views\Shared\_Layout.cshtml,並進行下列變更:

    • 將每個出現的 「My ASP.NET Application」 和 「Application name」 變更為 「Contoso University」。
    • 新增 Students、Courses、Instructors 和 Departments 的功能表項目,並刪除連絡人項目。

    變更會在下列程式碼片段中醒目提示:

    <!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 以執行網站。 您會看到主功能表的首頁。

安裝 Entity Framework 6

  1. 從 [ 工具] 功能表中,選擇 [NuGet 套件管理員],然後選擇 [ 套件管理員主控台]。

  2. 在 [Package Manager Console] 視窗中,輸入下列命令:

    Install-Package EntityFramework
    

此步驟是本教學課程手動執行的幾個步驟之一,但 ASP.NET MVC Scaffolding 功能可能已經自動完成。 您會手動執行這些動作,以便查看使用 Entity Framework (EF) 所需的步驟。 您稍後會使用 Scaffolding 來建立 MVC 控制器和檢視。 替代方式是讓 Scaffolding 自動安裝 EF NuGet 套件、建立資料庫內容類別別,以及建立連接字串。 當您準備好這麼做時,您只需要略過這些步驟,並在建立實體類別之後建立 MVC 控制器來建立 MVC 控制器。

建立資料模型

接下來您會為 Contoso 大學應用程式建立實體類別。 您將從下列三個實體開始:

課程<- >Enrollment-Student<>

實體 關聯性
註冊課程 一對多
學生註冊 一對多

StudentEnrollment 實體之間存在一對多關聯性,CourseEnrollment 實體之間也存在一對多關聯性。 換句話說,一位學生可以註冊並參加任何數目的課程,而一個課程也可以有任何數目的學生註冊。

在下列各節中,您將為每個實體建立類別。

注意

如果您在完成建立所有這些實體類別之前嘗試編譯專案,您將會收到編譯器錯誤。

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 會將名為 IDclassnameID 的屬性解譯為主鍵。

Enrollments 屬性為導覽屬性。 導覽屬性會保留與此實體相關的其他實體。 在此情況下, Enrollments 實體的 Student 屬性會保存與該 Student 實體相關的所有 Enrollment 實體。 換句話說,如果資料庫中的指定 Student 資料列有兩個相關 Enrollment 資料列, (資料列在其外鍵資料行中包含 StudentID 該學生的主鍵值) ,該 Student 實體的 Enrollments 導覽屬性將包含這兩 Enrollment 個實體。

流覽屬性通常會定義為 virtual ,以便利用某些 Entity Framework 功能,例如 延遲載入。 稍後將說明 (延遲載入,請參閱本系列稍後的 閱讀相關資料 教學課程。)

若導覽屬性可保有多個實體 (例如在多對多或一對多關聯性中的情況),其類型必須為一個清單,使得實體可以在該清單中新增、刪除或更新,例如 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 會是主鍵;此實體會使用classnameID 模式,而不是 ID 在您實體中看到的 Student 本身。 通常您會選擇一個模式,然後在您整個資料模型中使用此模式。 在這裡,此變化僅作為向您展示使用不同模式之用。 在稍後的教學課程中,您將瞭解如何使用 ID ,而不需要 classname 更輕鬆地在資料模型中實作繼承。

屬性 Grade列舉Grade 型別宣告後方的問號表示 Grade 屬性可為 Null。 Null 的成績與零等級不同- Null 表示成績未知或尚未指派。

StudentID 屬性是外部索引鍵,對應的導覽屬性是 StudentEnrollment 實體與一個 Student 實體關聯,因此屬性僅能保有單一 Student 實體 (不像您先前看到的 Student.Enrollments 導覽屬性可保有多個 Enrollment 實體)。

CourseID 屬性是外部索引鍵,對應的導覽屬性是 Course。 一個 Enrollment 實體與一個 Course 實體建立關聯。

Entity Framework 會將屬性解譯為外鍵屬性,如果屬性名稱為< 導覽屬性名稱 >< 主鍵屬性名稱 > (,例如,例如, StudentID 因為 Student 實體的主鍵是 ID) 的導覽屬性 Student 。 例如,外鍵屬性也可以命名為相同的< 主鍵屬性名稱 > (, 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 屬性為導覽屬性。 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 術語中, 實體集 通常會對應至資料庫資料表,而 實體 對應至資料表中的資料列。

注意

您可以省略 DbSet<Enrollment>DbSet<Course> 語句,而且其運作方式相同。 Entity Framework 會隱含包含它們, Student 因為實體會參考 Enrollment 實體,而實體會 Enrollment 參考 Course 實體。

指定連接字串

您稍後將新增至Web.config檔案的連接字串名稱 (,) 稍後會傳遞至建構函式。

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

您也可以傳入連接字串本身,而不是儲存在Web.config檔案中的名稱。 如需指定要使用之資料庫之選項的詳細資訊,請參閱 連接字串和模型

如果您未明確指定連接字串或一個連接字串的名稱,Entity Framework 會假設連接字串名稱與類別名稱相同。 接著,此範例中的預設連接字串名稱會是 SchoolContext ,與您明確指定的名稱相同。

指定單一資料表名稱

modelBuilder.Conventions.RemoveOnModelCreating方法中的 語句可防止資料表名稱進行複數化。 如果您未這麼做,資料庫中產生的資料表會命名為 StudentsCoursesEnrollments 。 相反地,資料表名稱會是 StudentCourseEnrollment 。 針對是否要複數化資料表名稱,開發人員並沒有共識。 本教學課程使用單一形式,但重點在於您可以藉由包含或省略這一行程式碼來選取您偏好的表單。

使用測試資料將 DB 初始化

Entity Framework 可以在應用程式執行時自動建立 (或卸載並重新建立資料庫) 。 您可以指定每次應用程式執行時,或只有在模型與現有資料庫不同步時,才應該完成此動作。 您也可以撰寫 Seed Entity Framework 在建立資料庫之後自動呼叫的方法,以填入測試資料。

預設行為是只有在資料庫不存在時 (建立資料庫,並在模型已變更且資料庫已存在時擲回例外狀況) 。 在本節中,您會指定每當模型變更時,應該卸載並重新建立資料庫。 卸載資料庫會導致所有資料遺失。 這在開發期間通常沒問題,因為 Seed 方法會在資料庫重新建立時執行,並且會重新建立測試資料。 但在生產環境中,您通常不想在每次需要變更資料庫架構時遺失所有資料。 稍後您將瞭解如何使用Code First 移轉來處理模型變更,以變更資料庫架構,而不是卸載和重新建立資料庫。

  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 使用初始化運算式類別,請在應用程式Web.config檔案中的元素 entityFramework (根專案資料夾) ,如下列範例所示:

    <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 指定初始化運算式類別和其位於的元件的完整名稱。 (當您不想使用初始化運算式時,您可以在 元素上 context 設定屬性: disableDatabaseInitialization="true" .) 如需詳細資訊,請參閱 組態檔設定

    Web.config 檔案中設定初始化運算式的替代方式是在程式碼中,方法是將 語句新增 Database.SetInitializerApplication_StartGlobal.asax.cs 檔案中的 方法。 如需詳細資訊,請參閱 瞭解 Entity Framework Code First 中的資料庫初始化運算式

現在已設定應用程式,因此當您第一次在指定執行應用程式的資料庫中存取資料庫時,Entity Framework 會將資料庫與模型進行比較, (和 SchoolContext 實體類別) 。 如果有差異,應用程式會卸載並重新建立資料庫。

注意

當您將應用程式部署至生產 Web 服務器時,必須移除或停用卸載並重新建立資料庫的程式碼。 您將在本系列稍後的教學課程中執行此動作。

設定 EF 6 以使用 LocalDB

LocalDB是SQL Server Express資料庫引擎的輕量型版本。 您可以輕鬆地安裝及設定、視需要啟動,並在使用者模式中執行。 LocalDB 是以SQL Server Express的特殊執行模式執行,可讓您使用資料庫作為.mdf檔案。 如果您想要使用專案複製資料庫,您可以將 LocalDB 資料庫檔案放在 Web 專案的 App_Data 資料夾中。 SQL Server Express中的使用者實例功能也可讓您使用.mdf檔案,但使用者實例功能已被取代;因此,建議使用 LocalDB 來處理.mdf檔案。 LocalDB 預設會隨 Visual Studio 一起安裝。

一般而言,SQL Server Express不會用於生產 Web 應用程式。 特別不建議將 LocalDB 用於生產環境與 Web 應用程式,因為它不是設計來搭配 IIS 使用。

  • 在本教學課程中,您將使用 LocalDB。 開啟應用程式Web.config檔案,並在 元素前面 appSettings 新增 connectionStrings 元素,如下列範例所示。 (確定您更新根專案資料夾中的Web.config檔案。Views子資料夾中也有一個Web.config檔案,您不需要 update.)

    <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 至連接字串。 如需連接字串的詳細資訊,請參閱SQL Server ASP.NET Web 應用程式的連接字串

您實際上不需要 Web.config 檔案中的連接字串。 如果您沒有提供連接字串,Entity Framework 會根據您的內容類別別使用預設連接字串。 如需詳細資訊,請參閱 第一個程式碼到新的資料庫

建立控制器和檢視

現在您將建立網頁來顯示資料。 要求資料的程式會自動觸發資料庫的建立。 您將從建立新的控制器開始。 但在這麼做之前,請先建置專案,讓模型和內容類別別可供 MVC 控制器 Scaffolding 使用。

  1. 以滑鼠右鍵按一下方案總管中的Controllers資料夾,選取 [新增],然後按一下 [新增 Scaffolded 專案]。

  2. 在 [ 新增 Scaffold ] 對話方塊中,選取 [具有檢視的 MVC 5 控制器],使用 Entity Framework,然後選擇 [ 新增]。

    在 Visual Studio 中新增 Scaffold 對話方塊

  3. 在 [ 新增控制器 ] 對話方塊中,進行下列選取,然後選擇 [ 新增]:

    • 模型類別: Student (ContosoUniversity.Models) 。 (如果您在下拉式清單中看不到此選項,請建置專案,然後再試一次。)

    • 資料內容類別別: SchoolCoNtext (ContosoUniversity.DAL)

    • 控制器名稱: StudentController (不是 StudentsController) 。

    • 保留其他欄位的預設值。

      當您按一下 [ 新增] 時,scaffolder 會建立 StudentController.cs 檔案和一組檢視, (.cshtml 檔案) 使用控制器。 未來當您建立使用 Entity Framework 的專案時,您也可以利用 Scaffolder 的一些額外功能:建立您的第一個模型類別、不要建立連接字串,然後在 [新增控制器] 方塊中選取 +[資料內容類別別] 旁的按鈕來指定[新增資料內容]。 Scaffolder 會建立您的 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 。 視瀏覽器視窗的範圍而定,您會在頂端網址列中看到 [學生] 索引標籤連結,或者您必須按一下右上角以查看連結。

    功能表按鈕

檢視資料庫

當您執行 Students 頁面且應用程式嘗試存取資料庫時,EF 發現沒有資料庫並建立資料庫。 EF 接著會執行種子方法,以將資料填入資料庫。

您可以使用伺服器總管或SQL Server 物件總管 ( SSOX) ,在 Visual Studio 中檢視資料庫。 在本教學課程中,您將使用 [伺服器總管]。

  1. 關閉瀏覽器。

  2. [伺服器總管] 中,展開 [ 資料連線 ] (您可能需要先選取 [重新整理] 按鈕) 、展開 [學校內容] (ContosoUniversity) ,然後展開 [ 資料表 ] 以查看新資料庫中的資料表。

  3. 以滑鼠右鍵按一下 Student 資料表,然後按一下 [ 顯示資料表資料 ] 以查看已建立的資料行,以及插入資料表的資料列。

  4. 關閉 [伺服器總管 ] 連線。

ContosoUniversity1.mdf.ldf資料庫檔案位於%USERPROFILE%資料夾中。

因為您使用 DropCreateDatabaseIfModelChanges 初始化運算式,所以您現在可以變更 Student 類別、再次執行應用程式,並自動重新建立資料庫以符合您的變更。 例如,如果您將屬性新增 EmailAddressStudent 類別,請再次執行 Students 頁面,然後再次查看資料表,您會看到新的 EmailAddress 資料行。

慣例

您必須撰寫的程式碼數量,以便 Entity Framework 能夠為您建立完整的資料庫,因為 慣例或 Entity Framework 所做的假設很小。 其中一些已記錄或已使用,但不知道:

  • 實體類別名稱的複數形式會當做資料表名稱使用。
  • 實體屬性名稱會用於資料行名稱。
  • 具名 IDclassnameID 的實體屬性會辨識為主鍵屬性。
  • 如果屬性的名稱< 為導覽屬性 (名稱 >< 主鍵屬性名稱,則屬性會解譯為外鍵屬性, >例如,例如, StudentID 因為 Student 實體的主鍵是 ID) 的導覽屬性 Student 。 例如,外鍵屬性也可以命名為相同的主 < 鍵屬性名稱 > (,例如, EnrollmentID 因為 Enrollment 實體的主鍵是 EnrollmentID) 。

您已瞭解可以覆寫慣例。 例如,您指定了資料表名稱不應該複數化,稍後您將瞭解如何將屬性明確標示為外鍵屬性。

取得程式碼

下載已完成的專案

其他資源

如需 EF 6 的詳細資訊,請參閱下列文章:

後續步驟

在本教學課程中,您:

  • 建立 MVC Web 應用程式
  • 設定網站樣式
  • 已安裝的 Entity Framework 6
  • 建立資料模型
  • 建立資料庫內容
  • 使用測試資料將 DB 初始化
  • 設定 EF 6 以使用 LocalDB
  • 建立控制器和檢視
  • 檢視資料庫

請前進到下一篇文章,以瞭解如何在控制器和檢視中檢閱和自訂建立、讀取、更新、刪除 (CRUD) 程式碼。