首页 > 代码库 > 演练5-1:Contoso大学校园管理1

演练5-1:Contoso大学校园管理1

**演练目的:掌握复杂模型的应用程序开发。

      Contoso大学校园管理系统功能包括学生、课程、教师的管理。

一、创建MVC Web应用程序

      显示效果如下图,操作步骤略。

二、创建数据模型

1.创建学生实体

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属性时主键,EF默认将Id或者classnameID作为主键。

      Enrollments属性是导航属性,导航属性拥有与这个实体相关联的实体。此处为学生实体拥有相关的所有课程注册实体,如在数据库中,课程注册表中张三有三条记录,那么导航属性就会有3条Enrollment行。创建导航属性后,数据库数据表将自动生成外键。如果导航属性能包含多个实体(如一对多,多对多),类型必须为集合,比如Icollection。

      导航属性通常定义成virtual,这样就可以好好利用EF的lazy loading(延迟加载)功能。延迟加载是指暂时不需要该数据,不用在当前马上加载,而可以推迟到使用它时再加载。延迟加载是一种很重要的数据访问特性,可以有效地减少与数据源的交互(注意,这里所提的交互不是指交互次数,而是指交互的数据量),从而提升程序性能。

2.创建课程实体

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属性是导航属性。

      CourseID考虑到可能有特殊的数据规则,使用[DatabaseGenerated(DatabaseGeneratedOption.None)],将不采用数据库自动生成的序号。

3.创建注册实体

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属性是一个enum枚举类型,?表示该属性可以为空。

      StudentID属性是一个外键,相应的导航属性是Student。一个注册实体和一个学生实体相关联,所以导航属性拥有一个Student实体,而不是之前的ICollection集合。

      CourseID同理。

4.创建数据库上下文

      创建一个DAL(Data Access Layer)文件夹,在文件夹中新建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; }    }}

      这段代码为每个实体集合,创建了一个DbSet属性。在EF技术中,一个实体集合对应一张数据库表,一个实体对应表中的一行。

      修改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" />

      默认情况下,EF会寻找DbContext类名字的连接字符串名字。在这个连接字符串中,你已经在App_Data文件夹下添加了一个名字为ContosoUniversity.mdf的LocalDB数据库。如果没有指定连接字符串,EF会为你新建一个。
5.开启Code First Migrations

(1)打开Package Manager控制台

(2)输入命令Enable-Migrations -ContextTypeName SchoolContext

    Configuration类包含一个Seed方法,可以在数据库创建时更新一些模型数据。

 

(3)

演练5-1:Contoso大学校园管理1