天天看點

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

本執行個體的學習環境: VS2015 + EF 6.2.0+ .NET 4.5.2

建立工程:

1.建立一個C# MVC Web應用程式(我起名為EFTest)

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

2. 在“ 建立ASP.NET項目”對話框中,選擇MVC模闆。更改身份驗證,改為不進行身份驗證(N)

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

3. 通過NuGet包管理器安裝EF6

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)
【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

代碼編寫:

1.打開視圖\ Shared \ _Layout.cshtml,并進行以下更改,如下圖出顯示:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - University Managerr</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @Html.ActionLink("University Managerr", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("首頁", "Index", "Home")</li>
                    <li>@Html.ActionLink("學生", "Index", "Student")</li>
                    <li>@Html.ActionLink("課程", "Index", "Course")</li>
                    <li>@Html.ActionLink("老師", "Index", "Instructor")</li>
                    <li>@Html.ActionLink("部門", "Index", "Department")</li>
                    <li>@Html.ActionLink("聯系方式", "Contact", "Home")</li>
                    <li>@Html.ActionLink("關于", "About", "Home")</li>
                </ul>
            </div>
        </div>
    </div>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - University Manager</p>
        </footer>
    </div>

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>
</html>

                

2. 在Views \ Home \ Index.cshtml中,使用以下代碼替換原有内容:

@{
    ViewBag.Title = "Home Page";
}

<div class="jumbotron">
    <h1> University Manager </h1>
</div>
<div class="row">
    <div class="col-md-4">
        <h2>Welcome to  University Manager </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 from the Microsoft Code Gallery.</p>
        <p><a class="btn btn-default" href="http://code.msdn.microsoft.com/ASPNET-MVC-Application-b01a9fe8">Download &raquo;</a></p>
    </div>
</div>


                

3.建立資料模型

接下來,您将為Contoso University 應用程式建立實體。将從以下三個實體開始:

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

Student和Enrollment是一對多關系,Course和Enrollment也是一對多的關系。換句話說,學生可以注冊任何數量的課程,課程可以被任何數量的學生注冊(學生和課程是多對多關系)。

3.1在Models檔案夾中,建立一個名為Student.cs的類檔案,并使用以下代碼替換模闆代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace EFTest.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; }
    }
}
                

3.2 在Models檔案夾中,建立Enrollment.cs并使用以下代碼替換現有代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace EFTest.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。通常會選擇一種固定的命名方式,并在所有資料模型中使用。在這裡,可以使用任意命名方式。在後面的教程中,将看到如何使用ID,而不用classnameID,這樣更容易在資料模型中實作繼承。

         該Grade屬性是一個枚舉類型。Grade類型後的問号表示該Grade屬性可以為空。空值表示未知等級或尚未配置設定。

         該StudentID屬性是一個外鍵,以及相應的導航屬性Student。一個Enrollment實體與一個Student實體相關聯,是以該屬性隻能儲存一個Student實體。

         該CourseID屬性也是一個外鍵,以及相應的導航屬性Course。一個Enrollment實體與一個Course實體相關聯。
         */
    }
}
                

3.3 在Models檔案夾中,建立Course.cs,使用以下代碼替換模闆代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.ComponentModel.DataAnnotations.Schema;
namespace EFTest.Models
{
    public class Course
    {
        //DatabaseGenerated屬性,DatabaseGeneratedOption.None 設定允許輸入課程主鍵,而不是讓資料庫自動生成它(不是自動增長)。

        [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; }
    }
}
                

4. 建立資料庫上下文

4.1 右鍵單擊該項目解決方案資料總管,然後單擊建立檔案夾。命名新檔案夾DAL(用于資料通路層)。在該檔案夾中建立一個名為UniversityContext.cs的類,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using EFTest.Models;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace EFTest.DAL
{
    public class UniversityContext: DbContext 
    {
        public UniversityContext() : base("UniversityDbContext")
        {
 
         }

        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>();
       }
}
}
                

4.2 在DAL檔案夾中,建立一個名為UniversityInitializer.cs的類,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using EFTest.Models;

namespace EFTest.DAL
{
    public class UniversityInitializer : DropCreateDatabaseIfModelChanges<UniversityContext>
    {
        protected override void Seed(UniversityContext context)
        {
            var students = new List<Student>
            {
            new Student{FirstMidName="zhang",LastName="san",EnrollmentDate=DateTime.Parse("2018-09-01")},
            new Student{FirstMidName="zhao",LastName="si",EnrollmentDate=DateTime.Parse("2017-09-01")},
            new Student{FirstMidName="wang",LastName="wu",EnrollmentDate=DateTime.Parse("2016-09-01")},
            new Student{FirstMidName="sui",LastName="liu",EnrollmentDate=DateTime.Parse("2015-09-01")},
            new Student{FirstMidName="zhou",LastName="qi",EnrollmentDate=DateTime.Parse("2014-09-01")},
            new Student{FirstMidName="wu",LastName="ba",EnrollmentDate=DateTime.Parse("2013-09-01")},
            new Student{FirstMidName="feng",LastName="jiu",EnrollmentDate=DateTime.Parse("2012-09-01")},
            new Student{FirstMidName="chen",LastName="shi",EnrollmentDate=DateTime.Parse("2011-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();
        }
    }
}
                

5. 修改Web.config檔案中連接配接字元串,如以下所示:

<entityFramework>
    <contexts>
      <context type="EFTest.DAL.UniversityContext, EFTest">
        <databaseInitializer type="EFTest.DAL.UniversityInitializer, EFTest" />
      </context>
    </contexts>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>
  <add name="UniversityDbContext" providerName="System.Data.SqlClient" connectionString="Data Source=localhost;Initial Catalog=University;Integrated Security=False;User Id=sa;Password=123456;MultipleActiveResultSets=True" />
  </connectionStrings>
                

6. 建立Student控制器和視圖

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)
【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

注:如果出現以下錯誤,則表示先要編譯一下,再建View

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

運作檢視 Student/Index 頁面:

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

點選“學生”界面:

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

檢視資料庫

沒有點選學生界面時,不涉及通路資料庫,是以開始沒有建立資料庫。

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

當運作學生頁面,應用程式嘗試通路資料庫時,EF看到沒有資料庫,是以它建立了一個資料庫,然後運作Seed()方法添加測試資料。

【ASP.NET】MVC5 + EF6(二)MVC5 + EF6執行個體(Code First 方式生成資料庫及初始化資料庫)

小結:

1.使用Entity Framework能夠建立一個完整的資料庫,發現我們隻編寫了很少的代碼,因為Entity Framework有預設約定:

實體類名一般用作表名。

實體屬性名稱用于列名。

名稱ID或classnameID屬性被識别為主鍵屬性。

還有外鍵屬性,例如,StudentID用于Student導航屬性。

當然我們可以将屬性顯式地标記為外鍵屬性等

繼續閱讀