教學課程:使用 MVC 5 開始使用 Entity Framework 6 Code First
注意
對於新開發,我們建議使用 ASP.NET Core Razor Pages,而不是 ASP.NET MVC 控制器和檢視。 有關使用 Razor Pages 的與此類似的教學課程系列,請參閱教學課程:ASP.NET Core 中的 Razor Pages 入門。 新教學課程:
- 比較容易學習。
- 提供更多 EF Core 最佳做法。
- 使用更有效率的查詢。
- 具有最新的 API。
- 涵蓋更多功能。
- 是新應用程式開發的建議方法。
在本系列教學課程中,您將了解如何建立使用 Entity Framework 6 進行資料存取的 ASP.NET MVC 5 應用程式。 本教學課程使用 Code First 工作流程。 有關如何在「程式碼優先」、「資料庫優先」和「模型優先」之間進行選擇的信息,請參閱建立模型。
本教學課程系列介紹如何建立 Contoso University 範例應用程式。 範例應用程式是一個簡單的大學網站。 使用它,您可以查看和更新學生、課程和教師資訊。 以下是您建立的兩個螢幕:
在本教學課程中,您已:
- 建立 MVC web 應用程式
- 設定網站樣式
- 安裝實體框架 6
- 建立資料模型
- 建立資料庫內容
- 使用測試資料將 DB 初始化
- 設定 EF 6 以使用 LocalDB
- 建立控制器和檢視
- 檢視資料庫
必要條件
建立 MVC web 應用程式
開啟 Visual Studio 並使用 ASP.NET Web 應用程式 (.NET Framework) 範本建立 C# Web 專案。 將專案命名為 ContosoUniversity 並選擇確定。
在新建 ASP.NET Web 應用程式 - ContosoUniversity 中,選擇 MVC。
注意
預設情況下,身份驗證選項設定為無身份驗證。 對於本教學課程,Web 應用程式不需要使用者登入。 此外,它不會根據登入者來限制存取。
選取 [確定] 可建立專案。
設定網站樣式
一些簡單的變更會設定網站的功能表、配置和首頁。
開啟 Views\Shared\_Layout.cshtml,並進行以下變更:
- 將每次出現的「我的 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>© @DateTime.Now.Year - Contoso University</p> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html>
在 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 »</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 »</a></p> </div> </div>
按 Ctrl+F5 來執行網站。 您會看到帶有主選單的主頁。
安裝實體框架 6
從工具功能表中,選擇“NuGet 套件管理器”,然後選擇“套件管理器控制台”。
在套件管理器控制台視窗中,輸入以下命令:
Install-Package EntityFramework
此步驟是本教學課程要求您手動執行的幾個步驟之一,但這可以透過 ASP.NET MVC 鷹架功能自動完成。 您手動執行這些操作,以便可以查看使用實體框架 (EF) 所需的步驟。 稍後您將使用支架來建立 MVC 控制器和檢視。 另一種方法是讓鷹架自動安裝 EF NuGet 套件、建立資料庫上下文類別並建立連接字串。 當您準備好這樣做時,您所要做的就是跳過這些步驟並在建立實體類別後建立您的 MVC 控制器。
建立資料模型
接下來您會為 Contoso 大學應用程式建立實體類別。 您將從以下三個實體開始:
課程<->入學<>-學生
實體 | 關聯 |
---|---|
課程到入學 | 一對多 |
學生到入學 | 一對多 |
在 Student
和 Enrollment
實體之間存在一對多關聯性,Course
與 Enrollment
實體之間也存在一對多關聯性。 換句話說,一位學生可以註冊並參加任何數目的課程,而一個課程也可以有任何數目的學生註冊。
在以下部分中,您將為每個實體建立一個類別。
注意
如果您在完成所有這些實體類別的建立之前嘗試編譯項目,則會出現編譯器錯誤。
Student 實體
在 Models 資料夾中,透過右鍵點擊解決方案資源管理器中的資料夾並選擇 AddClass 來建立一個名為 >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
屬性會成為資料庫資料表中的主索引鍵資料行,並對應至這個類別。 預設情況下,實體框架將命名 ID
或類別名稱ID
的屬性解釋為主鍵。
Enrollments
屬性為導覽屬性。 導覽屬性會保留與此實體相關的其他實體。 在這種情況下,Student
實體的 Enrollments
屬性將保留與 Enrollment
實體相關的所有 Student
實體。 換句話說,如果資料庫中的給定Student
行有兩個相關Enrollment
行 (StudentID
在其外鍵列中包含該學生的主鍵值的行Student
),則 Enrollments
Enrollment
實體的導航屬性將包含這兩個實體。
導航屬性通常被定義為 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
模式,而不是像您在 Student
實體中看到的那樣ID
單獨使用類別名稱模式。 通常您會選擇一個模式,然後在您整個資料模型中使用此模式。 在這裡,此變化僅作為向您展示使用不同模式之用。 在後面的教學課程中,您將了解如何使用 ID
withoutclassname
更輕鬆地在資料模型中實現繼承。
Grade
屬性是一個枚舉。 Grade
型別宣告後方的問號表示 Grade
屬性可為 Null。 空成績與零成績不同 - 空意味著成績未知或尚未分配。
StudentID
屬性是外部索引鍵,對應的導覽屬性是 Student
。 Enrollment
實體與一個 Student
實體關聯,因此屬性僅能保有單一 Student
實體 (不像您先前看到的 Student.Enrollments
導覽屬性可保有多個 Enrollment
實體)。
CourseID
屬性是外部索引鍵,對應的導覽屬性是 Course
。 一個 Enrollment
實體與一個 Course
實體建立關聯。
如果屬性名為導航屬性名稱主鍵屬性名稱 (<><>例如,對於導航屬性,StudentID
因為實體的主鍵為 Student
),實體框架會將屬性解釋為外鍵屬性。Student
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
屬性為導覽屬性。 Course
實體可以與任何數量的 Enrollment
實體相關。
我們將在本系列後面的教學課程中詳細介紹 DatabaseGeneratedAttribute 屬性。 基本上,此屬性可讓您為課程輸入主索引鍵,而非讓資料庫產生它。
建立資料庫內容
協調給定資料模型的實體框架功能的主要類別是資料庫上下文類別。 您可以透過從 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 屬性。 在實體框架術語中,實體集通常對應於資料庫表,實體對應於表中的一行。
注意
您可以省略 DbSet<Enrollment>
和 DbSet<Course>
語句,它的作用是相同的。 Student
實體框架將隱式包含它們,因為Enrollment
實體引用實體,Enrollment
實體引用 Course
實體。
指定連接字串
連接字串的名稱 (稍後將其新增至 Web.config 檔案) 將傳遞至建構函式。
public SchoolContext() : base("SchoolContext")
{
}
您也可以傳入連接字串本身,而不是儲存在 Web.config 檔案中的連接字串名稱。 有關指定要使用的資料庫的選項的更多信息,請參閱連接字串和模型。
如果您沒有明確指定連接字串或連接字串的名稱,實體框架會假定連接字串名稱與類別名稱相同。 此範例中的預設連接字串名稱將為 SchoolContext
,與您明確指定的名稱相同。
指定單數表名
OnModelCreating 方法中的 modelBuilder.Conventions.Remove
語句防止表名採用複數形式。 如果您不這樣做,資料庫中產生的表將命名為 Students
、Courses
和 Enrollments
。 相反,表名稱將為 Student
、Course
和 Enrollment
。 針對是否要複數化資料表名稱,開發人員並沒有共識。 本教學課程使用單數形式,但重要的一點是,您可以透過包含或省略這行程式碼來選擇您喜歡的形式。
使用測試資料將 DB 初始化
當應用程式運行時,實體框架可以自動建立 (或刪除並重新建立) 資料庫。 您可以指定每次執行應用程式時或僅在模型與現有資料庫不同步時執行此操作。 您也可以編寫一個 Seed
方法,實體框架在建立資料庫後自動呼叫該方法,以便用測試資料填入資料庫。
預設行為是僅當資料庫不存在時才建立資料庫 (如果模型已變更且資料庫已存在,則拋出例外狀況)。 在本部分中,您將指定每當模型變更時應刪除並重新建立資料庫。 刪除資料庫會導致所有資料遺失。 這在開發過程中通常是沒問題的,因為 Seed
方法將在重新建立資料庫時運行並重新建立測試資料。 但在生產中,您通常不希望每次需要更改資料庫模式時都丟失所有資料。 稍後您將了解如何透過使用 Code First 遷移來變更資料庫架構 (而不是刪除並重新建立資料庫) 來處理模型變更。
在 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
方法,但是如果在程式碼寫入資料庫時發生例外狀況,則這樣做可以幫助您找到問題的根源。若要告訴實體框架使用您的初始值設定項類,請將一個
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 檔案中設定初始值設定項目的另一種
Application_Start
方法是透過在 Global.asax.cs 檔案中的方法新增Database.SetInitializer
語句來在程式碼中進行設定。 有關更多信息,請參閱了解實體框架代碼中的資料庫初始值設定項目。
現在,應用程式已設定完畢,以便當您在應用程式的給定運行中首次存取資料庫時,實體框架會將資料庫與模型 (您的 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 檔案並在
connectionStrings
元素前面新增一個appSettings
元素,如下列範例所示。 (確保更新根專案資料夾中的 Web.config 檔案。Views 子資料夾中還有一個不需要更新的 Web.config 檔案。)<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>
您新增的連線字串指定實體框架將使用名為 ContosoUniversity1.mdf 的 LocalDB 資料庫。 (資料庫尚不存在,但 EF 將建立它。) 如果要在 App_Data 資料夾中建立資料庫,可以新增 AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf
到連接字串。 有關連接字串的詳細信息,請參閱 ASP.NET Web 應用程式的 SQL Server 連接字串。
您實際上不需要 Web.config 檔案中的連接字串。 如果您不提供連接字串,實體框架將根據您的上下文類別使用預設連接字串。 有關更多信息,請參閱首先對新資料庫進行編碼。
建立控制器和檢視
現在您將建立一個網頁來顯示資料。 請求資料的過程會自動觸發資料庫的建立。 您將首先建立一個新控制器。 但在此之前,請建置專案以使模型和上下文類別可用於 MVC 控制器支架。
右鍵點擊解決方案資源管理器中的控制器資料夾,選擇新增,然後按一下新支架項目。
在新增支架對話方塊中,選擇使用實體框架的帶有檢視的 MVC 5 控制器,然後選擇新增。
在新增控制器對話方塊中,進行以下選擇,然後選擇新增:
模型類別:Student (ContosoUniversity.Models)。 (如果您在下拉清單中沒有看到此選項,請建立專案並重試。)
資料上下文類別:SchoolContext (ContosoUniversity.DAL)。
控制器名稱:StudentController (不是 StudentsController)。
保留其他欄位的預設值。
當您按一下新增時,鷹架會建立一個 StudentController.cs 檔案和一組與控制器配合使用的檢視 (.cshtml 檔案)。 將來當您建立使用實體框架的專案時,您還可以利用支架的一些附加功能:建立您的第一個模型類,不要建立連接字串,然後在新增控制器方塊中指定新資料上下文透過選擇資料上下文類別旁邊的+按鈕。 支架將建立您的
DbContext
類別和連接字串以及控制器和檢視。
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> }
按 Ctrl+F5 執行專案。 (如果出現「無法建立影集副本」錯誤,請關閉瀏覽器並重試。)
按一下學生標籤以查看
Seed
方法插入的測試資料。 根據瀏覽器視窗的狹窄程度,您將在頂部地址欄中看到學生索引標籤鏈接,或者您必須點擊右上角才能看到該鏈接。
檢視資料庫
當您執行「學生」頁面並且應用程式嘗試存取資料庫時,EF 發現沒有資料庫並建立了一個。 然後 EF 運行種子方法以用資料填充資料庫。
您可以使用伺服器資源管理器或 SQL Server 物件資源管理器 (SSOX) 在 Visual Studio 中檢視資料庫。 在本教學課程中,您將使用伺服器資源管理器。
關閉瀏覽器。
在伺服器資源管理器中,展開資料連線 (您可能需要先選擇重新整理按鈕),展開學校上下文 (ContosoUniversity),然後展開表格以查看新資料庫中的表。
右鍵點擊 Student 資料表,然後按一下顯示表資料以查看已建立的列以及插入到表中的行。
關閉伺服器資源管理器連線。
ContosoUniversity1.mdf 和 .ldf 資料庫檔案位於 %USERPROFILE% 資料夾中。
因為您正在使用 DropCreateDatabaseIfModelChanges
初始化程序,所以您現在可以對 Student
類別進行更改,再次運行應用程序,並且資料庫將自動重新建立以匹配您的更改。 例如,如果您為 Student
類別新增 EmailAddress
屬性,再次執行「學生」頁面,然後再次檢視表格,您將看到一個 EmailAddress
新欄位。
慣例
由於實體框架所做的約定或假設,為了使實體框架能夠為您建立完整的資料庫,您必須編寫的程式碼量很少。 其中一些已經被注意到或在您不知情的情況下被使用:
- 實體類別名稱的複數形式用作表格名稱。
- 實體屬性名稱會用於資料行名稱。
- 命名
ID
或 類別名稱ID
的實體屬性被辨識為主鍵屬性。 - 如果屬性命名為 <導覽屬性名稱><主索引鍵屬性名稱>,系統就會將該屬性解譯為外部索引鍵屬性 (例如,若為
Student
導覽屬性則為StudentID
,因為Student
實體的主索引鍵是ID
)。 外鍵屬性也可以命名為相同的簡單主鍵<屬性名稱> (例如,EnrollmentID
因為實體的Enrollment
主鍵是EnrollmentID
)。
您已經看到約定可以被重寫。 例如,您指定表名不應採用複數形式,稍後您將看到如何將屬性明確標記為外鍵屬性。
取得程式碼
其他資源
有關 EF 6 的更多信息,請參閱以下文章:
下一步
在本教學課程中,您已:
- 建立了一個 MVC Web 應用程式
- 設定網站樣式
- 安裝實體框架 6
- 建立資料模型
- 建立資料庫內容
- 使用測試資料將 DB 初始化
- 設定 EF 6 以使用 LocalDB
- 建立控制器和檢視
- 檢視資料庫
繼續閱讀下一篇文章,了解如何在控制器和檢視中查看和自訂建立、讀取、更新、刪除 (CRUD) 程式碼。