EntityFramework_MVC4中EF5 新手入門教程之一 ---1.建立實體框架數據模型

Contoso University  Web 應用程序

你會在這些教程中構建的應用程序是一個簡單的大學網站。css

用戶能夠查看和更新學生、 課程和教師信息。這裏有幾個屏幕,您將建立。html

Students_Index_page 

這個網站的用戶界面樣式一直接近由內置的模板,生成的內容,以便本教程能夠集中主要精力如何使用實體框架。jquery

系統必備組件

方向和屏幕截圖在本教程中假定您正在使用Visual Studio 2012Visual Studio 2012 速成網站,最新的更新與截至 2013 年 7 月,安裝的 Windows Azure SDK。你能夠獲得這一切與下面的連接:web

Windows Azure SDK 以 Visual Studio 2012ajax

若是你有安裝了 Visual Studio,上面的連接將安裝任何缺乏的組件。若是你沒有 Visual Studio,該連接將安裝 Visual Studio 2012 速成網站。您可使用 Visual Studio 2013 年,但某些所需的程序和屏幕會有所不一樣。sql

建立 MVC Web 應用程序

打開 Visual Studio 並建立一個新 C# 項目命名爲"ContosoUniversity"使用ASP.NET MVC 4 Web 應用程序模板。請確保您的目標.NET 框架 4.5 (你會使用enum的屬性,而且,須要.NET 4.5)。數據庫

New_project_dialog_box

新的 ASP.NET MVC 4 項目對話框中選擇的互聯網應用模板。express

Razor視圖引擎選擇,和建立一個單元測試項目的複選框處於清除狀態的假期。canvas

單擊肯定.api

Project_template_options

創建了該網站的風格

幾個簡單的改變將設立網站菜單、 佈局和主頁。

打開Views\Shared\_Layout.cshtml,而後用如下代碼替換該文件的內容。突出顯示所作的更改。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>@ViewBag.Title - Contoso University</title> <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> <meta name="viewport" content="width=device-width" /> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <body> <header> <div class="content-wrapper"> <div class="float-left"> <p class="site-title">@Html.ActionLink("Contoso University", "Index", "Home")</p> </div> <div class="float-right"> <section id="login"> @Html.Partial("_LoginPartial") </section> <nav> <ul id="menu"> <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> </nav> </div> </div> </header> <div id="body"> @RenderSection("featured", required: false) <section class="content-wrapper main-content clear-fix"> @RenderBody() </section> </div> <footer> <div class="content-wrapper"> <div class="float-left"> <p>&copy; @DateTime.Now.Year - Contoso University</p> </div> </div> </footer> @Scripts.Render("~/bundles/jquery") @RenderSection("scripts", required: false) </body> </html>

這段代碼進行如下更改:

  • "個人 ASP.NET MVC 應用程序"和"您的徽標在這裏"的模板實例替換爲"Contoso University"。
  • 添加將使用在本教程後面的幾個操做環節。

Views\Home\Index.cshtml,用如下代碼,以消除有關 ASP.NET 和 MVC 模板段落替換該文件的內容:

@{
    ViewBag.Title = "Home Page";
}
@section featured {
    <section class="featured"> <div class="content-wrapper"> <hgroup class="title"> <h1>@ViewBag.Title.</h1> <h2>@ViewBag.Message</h2> </hgroup> </div> </section> }

Controllers\HomeController.cs,將值更改成ViewBag.Message Index操做方法中爲"歡迎來到 Contoso 大學 !",以下面的示例所示:

public ActionResult Index() { ViewBag.Message = "Welcome to Contoso University"; return View(); }

按 CTRL + F5 以運行網站。你看到主頁與主菜單。

Contoso_University_home_page

建立數據模型

接下來,您將建立實體類爲 Contoso University 中的應用。你將開始與如下三個實體:

Class_diagram

還有StudentEnrollment實體之間的一個一對多關係和CourseEnrollment實體之間是一對多的關係。換句話說,學生能夠在任意數量的課程,並固然能夠有任意數量的學生參加了它。

在如下部分中,您將建立一個類,用於每一個這些實體。

若是您嘗試編譯該項目,在您完成全部這些實體類的建立以前,你就會獲得編譯器錯誤。

學生實體

Student_entity

模型文件夾中,建立Student.cs和現有代碼替換爲如下代碼:

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

StudentID屬性將成爲此類對應的數據庫表的主鍵列。默認狀況下,實體框架將解釋是命名的ID類名ID做爲主鍵的屬性。

Enrollments屬性是一個導航屬性導航屬性持有此實體相關的其餘實體。在這種狀況下,一個Student實體的Enrollments屬性將保留全部的Enrollment實體的那個Student實體相關的。換言之,若是某一給定的Student行在數據庫中有兩個相關的Enrollment行 (包含在其StudentID的外鍵列中的那個學生主鍵值的行),該Student實體Enrollments導航屬性將包含這兩個Enrollment實體。

導航屬性一般定義爲virtual中,以便他們能夠利用某些實體框架功能,如延遲加載(延遲加載將稍後解釋,讀取相關數據教程稍後在本系列中。

若是一個導航屬性能夠容納多個實體 (如多多或一個一對多關係),其類型必須是一個列表條目能夠被添加、 刪除和更新,如ICollection.

註冊實體

Enrollment_entity

模型文件夾中,建立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; } } }

等級屬性是枚舉問號後Grade類型聲明指示Grade屬性是能夠爲 null爲 null 的品位是不一樣於零級 — — null 意味着等級鮮爲人知或沒有被指派。

StudentID屬性是一個外鍵,且相應的導航屬性是StudentEnrollment實體是與一個Student實體相關聯,因此該屬性只能容納一個單一的Student實體 (不像Student.Enrollments導航屬性你前面所述,而數組能夠存放多個Enrollment實體)。

CourseID屬性是一個外鍵,且相應的導航屬性CourseEnrollment實體是與一個Course實體相關聯。

課程實體

Course_entity

模型文件夾中,建立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實體。

咱們會說更多關於[DatabaseGenerated(DatabaseGeneratedOption.None)] 在接下來的教程中的屬性。基本上,此屬性容許您爲該課程而不是生成的數據庫輸入的主鍵。

建立Database Context

座標給定的數據模型的實體框架功能的主類是數據庫上下文類。經過從System.Data.Entity.DbContext類派生來建立此類。在您的代碼中您指定數據模型中包括哪些實體。您還能夠自定義某些實體框架行爲。在這個項目中,類名爲SchoolContext.

建立一個文件夾命名DAL (爲數據訪問層)。在該文件夾中建立一個新的類文件,命名爲SchoolContext.cs,和現有的代碼替換爲如下代碼:

using ContosoUniversity.Models; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; namespace ContosoUniversity.DAL { public class SchoolContext : DbContext { 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屬性爲每一個實體集。在實體框架術語中,實體集一般對應於數據庫表,和一個實體對應於表中的一行。

OnModelCreating方法中的modelBuilder.Conventions.Remove語句能夠防止表名稱正在趨向多元化。若是你不這樣作,所生成的表將命名爲StudentsCoursesEnrollments相反,表名稱將是StudentCourse、 及Enrollment表名稱應該多數開發商不一樣意。本教程使用的是單數形式,但重要的一點是您能夠選擇哪一個你更喜歡經過包括或省略下面這行代碼的形式。

SQL 服務器快遞 LocalDB

LocalDB是一個輕量級版本 SQL Server 表示數據庫引擎的按需啓動和運行在用戶模式下。LocalDB 運行的 SQL Server Express 使您可以使用數據庫的.mdf文件做爲特殊的執行方式。一般狀況下,LocalDB 數據庫文件保存在 web 項目的App_Data文件夾中。在 SQL Server Express用戶實例功能還使您可以使用.mdf文件,但不推薦使用用戶實例的功能 ;所以,LocalDB 被推薦使用的.mdf文件。

一般 SQL Server Express 的並不用於生產的 web 應用程序。LocalDB 尤爲不推薦用於生產一個 web 應用程序由於它不設計工做的非法入境者。

在 Visual Studio 2012 及之後的版本中,默認狀況下,Visual Studio 安裝 LocalDB。在 Visual Studio 2010 及更早版本中,在默認狀況下,Visual Studio ; 安裝 SQL Server Express (無 LocalDB)您必須手動安裝它,若是你使用的 Visual Studio 2010。

在本教程中您將使用 LocalDB,以便數據庫能夠存儲在.mdf文件所在的App_Data文件夾中。打開根Web.config文件併到connectionStrings集合中,添加一個新的鏈接字符串,以下面的示例所示。(請確保您更新Web.config文件中的根項目文件夾。此外,還有 Web.config文件是您不須要更新的視圖子文件夾中。)

 <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\ContosoUniversity.mdf" providerName="System.Data.SqlClient" />

默認狀況下,實體框架查找名爲DbContext類 (此項目SchoolContext ) 相同的鏈接字符串。您已經添加的鏈接字符串指定一個名爲ContosoUniversity.mdf位於App_Data文件夾中的 LocalDB 數據庫。更多的信息,請參見ASP.NET Web 應用程序的 SQL 服務器鏈接字符串.

實際上,您不須要指定的鏈接字符串。若是您不提供鏈接字符串,實體框架將建立一個爲您 ;可是,數據庫可能沒法在您的應用程序的App_data文件夾中。將建立數據庫的信息,請參見代碼第一次到新的數據庫.

connectionStrings集合還具備一個名爲DefaultConnection的用於成員資格數據庫的鏈接字符串。在本教程中,您不會使用成員資格數據庫。兩個鏈接字符串之間的惟一區別是數據庫名稱和名稱屬性值。

設置和執行代碼第一次遷移

當你第一次開始開發應用程序時,您的數據模型更改頻繁,並且每次獲取與數據庫不一樣步的模型更改。您能夠配置實體框架能夠自動刪除並從新建立該數據庫的每次更改數據模型。這不是一個問題在開發的早期,由於測試數據是很容易從新建立,可是您已經部署到生產後你一般想要更新數據庫架構,而不刪除數據庫。遷移功能使代碼第一要更新數據庫,而不會刪除並從新建立它。早在開發週期中的一個新的項目你可能想要使用DropCreateDatabaseIfModelChanges ,能夠刪除、 從新建立和從新設置爲種子數據庫每次模型更改。一我的,你準備部署您的應用程序,您能夠轉換爲的遷移方法。在本教程中,您將僅使用遷移。有關的詳細信息,請參見代碼第一次遷移遷移截屏視頻系列.

啓用代碼第一次遷移

  1. 工具菜單上,單擊庫程序包管理器,而後程序包管理器控制檯.

    Selecting_Package_Manager_Console

  2. PM>提示符下輸入如下命令:

    enable-migrations -contexttypename SchoolContext

    enable-migrations command

    此命令在 ContosoUniversity 項目中,建立一個遷移文件夾和它在該文件夾中放一個Configuration.cs文件,您能夠編輯配置遷移。

    Migrations folder

    Configuration類包括建立數據庫時,每次更新數據模型更改後調用的Seed方法。

    internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.Models.SchoolContext> { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(ContosoUniversity.Models.SchoolContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method  // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // } }

    Seed方法的目的是使您可以向數據庫中插入測試數據後代碼第一次建立或更新它。

創建了種子法

種子方法運行時代碼第一次遷移建立數據庫和每一次它將更新到最新的遷移數據庫。種子法的目的是爲了使您可以將數據插入到表以前應用程序訪問數據庫第一次。

在早期版本的代碼優先,遷移被釋放以前,它是日常的Seed方法來插入測試數據,由於在開發過程當中的每一個模型修改數據庫不得不被徹底刪除和從新建立從零開始。與代碼第一次遷移,測試數據保留後數據庫更改,所以包括種子方法中的測試數據一般不是必需。事實上,你不想要插入測試數據,若是您將使用遷移將數據庫部署到生產,由於Seed方法將運行在生產中的Seed 方法。在這種狀況下你但願Seed 方法向數據庫中插入你想要在生產中插入的數據。例如,您可能想要包括實際部門名稱Department表中,當應用程序在生產中可用的數據庫。

對於本教程,您將使用遷移的部署,但你的Seed 方法將插入測試數據不管如何爲了使它更加輕鬆地查看應用程序的功能而無需手動插入大量的數據的工做。

  1. Configuration.cs文件的內容替換爲如下代碼中,將測試數據加載到新的數據庫。
    namespace ContosoUniversity.Migrations { using System; using System.Collections.Generic; using System.Data.Entity.Migrations; using System.Linq; using ContosoUniversity.Models; internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext> { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(ContosoUniversity.DAL.SchoolContext context) { var students = new List<Student> { new Student { FirstMidName = "Carson", LastName = "Alexander", EnrollmentDate = DateTime.Parse("2010-09-01") }, new Student { FirstMidName = "Meredith", LastName = "Alonso", EnrollmentDate = DateTime.Parse("2012-09-01") }, new Student { FirstMidName = "Arturo", LastName = "Anand", EnrollmentDate = DateTime.Parse("2013-09-01") }, new Student { FirstMidName = "Gytis", LastName = "Barzdukas", EnrollmentDate = DateTime.Parse("2012-09-01") }, new Student { FirstMidName = "Yan", LastName = "Li", EnrollmentDate = DateTime.Parse("2012-09-01") }, new Student { FirstMidName = "Peggy", LastName = "Justice", EnrollmentDate = DateTime.Parse("2011-09-01") }, new Student { FirstMidName = "Laura", LastName = "Norman", EnrollmentDate = DateTime.Parse("2013-09-01") }, new Student { FirstMidName = "Nino", LastName = "Olivetto", EnrollmentDate = DateTime.Parse("2005-08-11") } }; students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, 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,},newCourse{CourseID=3141,Title="Trigonometry",Credits=4,},newCourse{CourseID=2021,Title="Composition",Credits=3,},newCourse{CourseID=2042,Title="Literature",Credits=4,}}; courses.ForEach(s => context.Courses.AddOrUpdate(p => p.Title, s)); context.SaveChanges();var enrollments =newList<Enrollment>{newEnrollment{StudentID= students.Single(s => s.LastName=="Alexander").StudentID,CourseID= courses.Single(c => c.Title=="Chemistry").CourseID,Grade=Grade.A },newEnrollment{StudentID= students.Single(s => s.LastName=="Alexander").StudentID,CourseID= courses.Single(c => c.Title=="Microeconomics").CourseID,Grade=Grade.C },newEnrollment{StudentID= students.Single(s => s.LastName=="Alexander").StudentID,CourseID= courses.Single(c => c.Title=="Macroeconomics").CourseID,Grade=Grade.B },newEnrollment{StudentID= students.Single(s => s.LastName=="Alonso").StudentID,CourseID= courses.Single(c => c.Title=="Calculus").CourseID,Grade=Grade.B },newEnrollment{StudentID= students.Single(s => s.LastName=="Alonso").StudentID,CourseID= courses.Single(c => c.Title=="Trigonometry").CourseID,Grade=Grade.B },newEnrollment{StudentID= students.Single(s => s.LastName=="Alonso").StudentID,CourseID= courses.Single(c => c.Title=="Composition").CourseID,Grade=Grade.B },newEnrollment{StudentID= students.Single(s => s.LastName=="Anand").StudentID,CourseID= courses.Single(c => c.Title=="Chemistry").CourseID},newEnrollment{StudentID= students.Single(s => s.LastName=="Anand").StudentID,CourseID= courses.Single(c => c.Title=="Microeconomics").CourseID,Grade=Grade.B },newEnrollment{StudentID= students.Single(s => s.LastName=="Barzdukas").StudentID,CourseID= courses.Single(c => c.Title=="Chemistry").CourseID,Grade=Grade.B },newEnrollment{StudentID= students.Single(s => s.LastName=="Li").StudentID,CourseID= courses.Single(c => c.Title=="Composition").CourseID,Grade=Grade.B },newEnrollment{StudentID= students.Single(s => s.LastName=="Justice").StudentID,CourseID= courses.Single(c => c.Title=="Literature").CourseID,Grade=Grade.B }};foreach(Enrollment e in enrollments){var enrollmentInDataBase = context.Enrollments.Where( s => s.Student.StudentID== e.StudentID&& s.Course.CourseID== e.CourseID).SingleOrDefault();if(enrollmentInDataBase ==null){ context.Enrollments.Add(e);}} context.SaveChanges();}}}

    種子方法採用數據庫上下文對象做爲輸入參數和方法中的代碼使用該對象來向數據庫中添加新的實體。代碼爲每一個實體類型,建立一個新的實體的集合,將它們添加到適當的DbSet屬性,而後將所作的更改保存到數據庫。這是沒有必要後每一個組的實體,調用SaveChanges方法,由於在這裏,但這樣作能夠幫助你找到問題的根源,若是向數據庫寫入代碼時發生的異常。

    一些插入數據的語句使用AddOrUpdate方法執行"upsert"操做。由於Seed 方法運行與每一個遷移時,你不能只是將數據插入,由於您試圖添加的行就已經在那裏建立數據庫的第一次遷移後。"Upsert"操做能夠防止錯誤若是您嘗試插入行已經存在,但它將重寫將會發生任何更改你可能已經在測試應用程序時的數據。用測試數據在某些表中您可能不但願這樣的事情發生: 在某些狀況下當您更改數據在測試時你想要更改數據庫更新後繼續。在這種狀況下,你想要作一個有條件的插入操做: 插入行,只有當它不存在。種子方法使用這兩種方法。

    第一個參數傳遞給AddOrUpdate方法指定要用來檢查是否已存在的行的屬性。爲您提供的學生 (測試) 數據,LastName屬性能夠用於此目的由於每一個列表中的最後一個名稱是惟一的:

    context.Students.AddOrUpdate(p => p.LastName, s)

    此代碼假定最後一名是惟一的。若是您手動添加具備重複的姓氏的一名學生,你會獲得下面的異常下次您執行遷移。

    序列包含一個以上的元素

    AddOrUpdate方法的更多信息,請參閱在 Julie Lerman 博客上的照顧與 EF 4.3 AddOrUpdate 方法

    添加Enrollment實體的代碼不使用 AddOrUpdate方法。它會檢查是否實體已經存在,而且插入實體,若是它不存在。這種方法將保留到入學年級遷移運行時所作的更改。代碼遍歷每一個成員的Enrollment 列表,若是在數據庫中找不到註冊,它向數據庫中添加註冊。第一次你更新數據庫,數據庫將爲空,因此它將添加每一個招生。

    foreach (Enrollment e in enrollments) { var enrollmentInDataBase = context.Enrollments.Where( s => s.Student.StudentID == e.Student.StudentID && s.Course.CourseID == e.Course.CourseID).SingleOrDefault(); if (enrollmentInDataBase == null) { context.Enrollments.Add(e); } }

    有關如何調試Seed 方法以及如何處理多餘的數據,如命名爲"亞歷山大 · 卡森"的兩個學生的信息,請參閱在裏克 • 安德森的博客上的播種及調試實體框架 (EF) 星展銀行

  2. 生成項目。

建立和執行第一次遷移

  1. 在程序包管理器控制檯窗口中,輸入如下命令:
    add-migration InitialCreate update-database

    add-migration命令將添加到遷移文件夾[DateStamp]_InitialCreate.cs文件,其中包含建立數據庫的代碼。第一個參數 (InitialCreate)用於文件的名稱,而且能夠是任何你想要的 ;你一般選擇的單詞或短語總結了正在作遷移中。例如,您可能會命名之後遷移"AddDepartmentTable"。

    Migrations folder with initial migration

    UpInitialCreate類的方法建立的數據庫表,對應於數據模型實體集,並 Down方法刪除它們。遷移調用Up方法來執行數據模型更改成遷移。當你輸入一個命令來回滾更新時,遷移調用Down方法。下面的代碼演示了InitialCreate 文件的內容:

    namespace ContosoUniversity.Migrations { using System; using System.Data.Entity.Migrations; public partial class InitialCreate : DbMigration { public override void Up() { CreateTable( "dbo.Student", c => new { StudentID = c.Int(nullable: false, identity: true), LastName = c.String(), FirstMidName = c.String(), EnrollmentDate = c.DateTime(nullable: false), }) .PrimaryKey(t => t.StudentID); CreateTable( "dbo.Enrollment", c => new { EnrollmentID = c.Int(nullable: false, identity: true), CourseID = c.Int(nullable: false), StudentID = c.Int(nullable: false), Grade = c.Int(), }) .PrimaryKey(t => t.EnrollmentID) .ForeignKey("dbo.Course", t => t.CourseID, cascadeDelete: true) .ForeignKey("dbo.Student", t => t.StudentID, cascadeDelete: true) .Index(t => t.CourseID) .Index(t => t.StudentID); CreateTable( "dbo.Course", c => new { CourseID = c.Int(nullable: false), Title = c.String(), Credits = c.Int(nullable: false), }) .PrimaryKey(t => t.CourseID); } public override void Down() { DropIndex("dbo.Enrollment", new[] { "StudentID" }); DropIndex("dbo.Enrollment", new[] { "CourseID" }); DropForeignKey("dbo.Enrollment", "StudentID", "dbo.Student"); DropForeignKey("dbo.Enrollment", "CourseID", "dbo.Course"); DropTable("dbo.Course"); DropTable("dbo.Enrollment"); DropTable("dbo.Student"); } } }

    update-database命令運行Up方法來建立數據庫,而後它運行Seed 方法來填充該數據庫。

如今前,該署爲您的數據模型,建立一個 SQL Server 數據庫。數據庫的名稱是ContosoUniversity,和.mdf文件是在您的項目的App_Data文件夾中,由於那是您在您的鏈接字符串中指定。

你可使用服務器資源管理器SQL 服務器對象資源管理器(SSOX) 在 Visual Studio 中查看的數據庫。在本教程中,您將使用服務器資源管理器在 Visual Studio 表達 2012 網站,服務器資源管理器調用數據庫資源管理器.

  1. 視圖菜單上,單擊服務器資源管理器.

  2. 單擊添加鏈接圖標。



  3. 若是系統提示您與選擇數據源對話框中,單擊Microsoft SQL Server,而後單擊繼續.

  4. 添加鏈接對話框中,輸入服務器名稱 (localdb) \v11.0 。選擇或輸入數據庫名稱下,選擇ContosoUniversity.

  5. 單擊OK。

  6. 展開SchoolContext ,而後展開.

  7. 右鍵單擊學生表,單擊顯示錶數據,請參閱建立列和被插入到表中的行。

    Student table 

建立學生控制器和視圖

下一步是建立 ASP.NET MVC 控制器和視圖在您的應用程序可使用這些表之一。

  1. 若要建立一個Student控制器,用鼠標右鍵單擊控制器文件夾中的解決方案資源管理器中,選擇添加,,而後單擊控制器添加控制器對話框中,選擇如下選項,而後單擊添加:
    • 控制器的名稱: StudentController.
    • 模板: MVC 控制器的讀/寫操做和視圖,使用實體框架.
    • 模型類:學生 (ContosoUniversity.Models)(若是看不到此選項在下拉列表中的,生成項目,並再試一次)。
    • 數據上下文類: SchoolContext (ContosoUniversity.Models).
    • 視圖:Razor (CSHTML)(默認值)。

    Add_Controller_dialog_box_for_Student_controller

  2. Visual Studio 會打開Controllers\StudentController.cs文件。你看到一個類變量已建立該實例化數據庫上下文對象:

    private SchoolContext db = new SchoolContext();

    Index操做方法從學生實體經過讀取數據庫上下文實例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.StudentID }) | @Html.ActionLink("Details", "Details", new { id=item.StudentID }) | @Html.ActionLink("Delete", "Delete", new { id=item.StudentID }) </td> </tr> }
  3. 按 CTRL + F5 以運行該項目。

    單擊學生選項卡以查看 Seed方法插入的測試數據。

    Student Index page

公約

因爲採用了各項公約或使實體框架的假設,你不得不爲實體框架,以便可以爲您建立一個完整的數據庫按順序寫的代碼量很小。其中一些已經被注意到:

  • 多元化的形式的實體類的名字被用做表名稱。
  • 實體屬性名稱用於列的名稱。
  • 被命名爲ID類名ID的實體屬性被視爲首要的關鍵屬性。

你見過能夠覆蓋公約 (例如,您指定不該該多元化表名稱),而且您將瞭解更多關於各項公約以及如何建立一個更復雜的數據模型後來在這個系列教程中重寫它們。更多的信息,請參閱代碼第一次約定.

摘要

如今,您已經建立一個簡單的應用程序,使用實體框架和 SQL Server Express 來存儲和顯示數據。在下面的教程中,您將學習如何執行基本的 CRUD (建立、 讀取、 更新、 刪除) 操做。你能夠離開此頁面底部的反饋。請讓咱們知道如何你喜歡本教程的這一部分,咱們如何能改善它。

相關文章
相關標籤/搜索