MVC5与EF6结合教程(01):创建EF数据模型

原文:https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

Note

对于新开发,我们建议ASP.NET Core Razor Pages ASP.NET MVC 控制器和视图。 有关使用 Razor Pages 的与此类似的系列教程,请参阅教程: ASP.NET Core 中的 Razor Pages 入门 新教程:

  • 易于关注。
  • 提供更多 EF Core 最佳做法。
  • 使用更高效的查询。
  • 通过最新 API 更新到更高版本。
  • 涵盖更多功能。
  • 是开发新应用程序的首选方法。

在本系列教程中,您将了解如何生成使用实体框架6进行数据访问的 ASP.NET MVC 5 应用程序。 本教程使用 Code First 工作流。 有关如何在 Code First、Database First 和 Model First 之间进行选择的详细信息,请参阅创建模型

本系列教程介绍了如何构建 Contoso 大学的示例应用程序。 该示例应用程序是一个简单的大学网站。 利用它,你可以查看和更新学生、课程和教师信息。 下面是创建的两个屏幕:

Students_Index_page

编辑学生

在本教程中,你将了解:

  • 创建 MVC web 应用
  • 设置网站样式
  • 安装实体框架6
  • 创建数据模型
  • 创建数据库上下文
  • 使用测试数据初始化数据库
  • 设置 EF 6 以使用 LocalDB
  • 创建控制器和视图
  • 查看数据库

一、系统必备

二、创建 MVC web 应用

  1. 打开 Visual Studio,并使用C# " ASP.NET web 应用程序(.NET Framework) " 模板创建一个 web 项目。 将项目命名为ContosoUniversity ,然后选择 "确定"

    Visual Studio 中的 "新建项目" 对话框

  2. New ASP.NET Web 应用程序-ContosoUniversity中,选择 " MVC"。

    Visual Studio 中的 "新建 web 应用" 对话框

    Note

    默认情况下, authentication选项设置为 "无身份验证"。 对于本教程,web 应用不需要用户登录。 此外,它不会基于登录用户限制访问权限。

  3. 选择“确定”创建项目。

三、设置网站样式

通过几个简单的更改设置站点菜单、 布局和主页。

  1. _Layout打开 ViewsShared,并进行以下更改:

    • 将每次出现的 "我的 ASP.NET Application" 和 "Application name" 更改为 "Contoso 大学"。
    • 为学生、课程、教师和部门添加菜单项,并删除联系人条目。

    下面的代码片段突出显示了这些更改:

    <!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. ViewsHomeIndex.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 运行该网站。 你将看到带有主菜单的主页。

四、安装实体框架6

  1. 从 "工具" 菜单中,选择 " NuGet 包管理器",然后选择 "程序包管理器控制台"。

  2. 在“程序包管理器控制台”窗口中,输入以下命令:

    Install-Package EntityFramework
    

此步骤是本教程手动执行的几个步骤中的一步,但这可能已由 ASP.NET MVC 基架功能自动完成。 您要手动执行这些操作,以便您可以查看使用实体框架(EF)所需的步骤。 稍后将使用基架创建 MVC 控制器和视图。 替代方法是让基架自动安装 EF NuGet 包、创建数据库上下文类并创建连接字符串。 当您准备好这样做时,您需要做的就是在创建实体类后,跳过这些步骤并基架 MVC 控制器。

五、创建数据模型

接下来你将创建 Contoso 大学应用程序的实体类。 你将从以下三个实体开始:

课程 <-> 注册 <-> 学生

实体 关系
课程注册课程 一对多
学生注册 一对多

StudentEnrollment实体之间是一对多的关系,CourseEnrollment 实体之间也是一个对多的关系。 换而言之,一名学生可以修读任意数量的课程, 并且某一课程可以被任意数量的学生修读。

在下面几节中,你将为其中的每个实体创建一个类。

Note

如果尝试在完成所有这些实体类的创建之前编译项目,将会出现编译器错误。

1、Student 实体

  • 在 "模型" 文件夹中,右键单击解决方案资源管理器的文件夹,然后选择 "添加 > ",创建名为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 属性将成为对应于此类的数据库表中的主键。 默认情况下,实体框架会将名为 IDclassname ID 的属性解释为主键。

Enrollments 属性是导航属性 导航属性中包含与此实体相关的其他实体。 在这种情况下,Student 实体的 Enrollments 属性将包含与该 Student 实体相关的所有 Enrollment 实体。 换言之,如果数据库中给定的 Student 行具有两个相关 Enrollment 行(其 StudentID 外键列中包含该学生的主键值的行),则该 Student 实体的 Enrollments 导航属性将包含这两个 Enrollment 的实体。

导航属性通常定义为 virtual,以便它们可以利用某些实体框架功能,如延迟加载 (稍后将在本系列的 "读取相关数据" 教程中介绍延迟加载。)

如果导航属性可以具有多个实体 (如多对多或一对多关系),那么导航属性的类型必须是可以添加、 删除和更新条目的容器,如 ICollection

2、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 属性将为主键;此实体使用classname ID 模式,而不是在 Student 实体中看到的那样 ID 通常情况下,你选择一个主键模式,并在你的数据模型自始至终使用这种模式。 在这里,使用了两种不同的模式只是为了说明你可以使用任一模式来指定主键。 在后面的教程中,你将了解如何使用不带 classnameID,从而更轻松地在数据模型中实现继承。

Grade 属性是一个枚举 Grade 声明类型后的?表示 Grade 属性可以为 null Null 的级别不同于零级别,null 表示分数未知或尚未赋值。

StudentID 属性是一个外键,Student 是与其且对应的导航属性。 Enrollment 实体与一个 Student 实体相关联,因此该属性只包含单个 Student 实体 (与前面所看到的 Student.Enrollments 导航属性不同后,Student中可以容纳多个 Enrollment 实体)。

CourseID 属性是一个外键,Course 是与其且对应的导航属性。 Enrollment 实体与一个 Course 实体相关联。

实体框架将属性指定为外键属性,如果该属性命名为 <导航属性名称><主键属性名称> (例如,StudentID 导航属性 Student,因为 Student 实体的主键是 ID)。 也可以将外键属性命名为相同 <主键属性名称> (例如 CourseID,因为 Course 实体的主键是 CourseID)。

3、Course 实体

  • 在 "模型" 文件夹中,创建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 特性。 简单来说,此特性让你能自行指定主键,而不是让数据库自动指定主键。

六、创建数据库上下文

为给定数据模型协调实体框架功能的主类是数据库上下文类。 可以通过从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>();
            }
        }
    }
    

1、指定实体集

此代码为每个实体集创建一个DbSet属性。 在实体框架术语中,实体集通常对应于数据库表,实体对应于表中的行。

Note

您可以省略 DbSet<Enrollment>DbSet<Course> 语句,它的工作原理相同。 实体框架将隐式包含它们,因为 Student 实体引用 Enrollment 实体,而 Enrollment 实体引用 Course 实体。

2、指定连接字符串

连接字符串的名称(稍后要添加到 web.config 文件中)将传递到构造函数。

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

你还可以传递连接字符串本身,而不是存储在 web.config 文件中的连接字符串的名称。 有关用于指定要使用的数据库的选项的详细信息,请参阅连接字符串和模型

如果未显式指定连接字符串或名称,则实体框架假设连接字符串名称与类名称相同。 然后,本示例中的默认连接字符串名称将为 SchoolContext,就像您显式指定的一样。

3、指定单一表名称

OnModelCreating方法中的 modelBuilder.Conventions.Remove 语句阻止复数表名称。 如果未执行此操作,则数据库中生成的表将被命名为 StudentsCoursesEnrollments 相反,表名称将为 StudentCourseEnrollment 开发者对表名称是否应为复数意见不一。 本教程使用单数形式,但重要的是,您可以选择您喜欢的任何形式,包括或省略此行代码。

七、使用测试数据初始化数据库

当应用程序运行时,实体框架可以自动创建(或删除并重新创建)数据库。 您可以指定在每次应用程序运行时执行此操作,或仅在模型与现有数据库不同步时执行此操作。 您还可以编写一个 Seed 方法,该方法实体框架在创建数据库后自动调用,以便使用测试数据填充它。

默认行为是只在数据库不存在时才创建数据库(如果模型发生了更改并且数据库已存在,则会引发异常)。 在本部分中,你将指定在模型发生更改时应删除并重新创建数据库。 删除数据库将导致丢失所有数据。 这通常在开发过程中是正常的,因为在重新创建数据库时将运行 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. 若要告诉实体框架使用初始值设定项类,请将一个元素添加到应用程序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 指定初始值设定项类及其所在程序集的完全限定名称。 (如果不希望 EF 使用初始值设定项,则可在 context 元素上设置属性: disableDatabaseInitialization="true"。)有关详细信息,请参阅配置文件设置

    web.config 文件中设置初始值设定项的替代方法是在Global.asax.cs文件中将 Database.SetInitializer 语句添加到 Application_Start 方法,以便在代码中执行此操作。 有关详细信息,请参阅了解实体框架 Code First 中的数据库初始值设定项

现在已设置应用程序,以便在应用程序的给定运行中首次访问数据库时,实体框架将数据库与模型(SchoolContext 和实体类)进行比较。 如果存在差异,应用程序会删除并重新创建数据库。

Note

将应用程序部署到生产 web 服务器时,必须删除或禁用删除并重新创建该数据库的代码。 你将在本系列的后续教程中执行此操作。

八、设置 EF 6 以使用 LocalDB

LocalDB是 SQL Server Express 数据库引擎的轻型版本。 它易于安装和配置,可以按需启动并在用户模式下运行。 LocalDB 在 SQL Server Express 的特殊执行模式下运行,该模式使您能够将数据库用作 .mdf文件。 如果希望能够使用项目复制数据库,则可以将 LocalDB 数据库文件放在 web 项目的应用_Data文件夹中。 使用 SQL Server Express 中的用户实例功能,还可以使用 .mdf文件,但不推荐使用用户实例功能;因此,建议使用 LocalDB 来处理 .mdf文件。 默认情况下,使用 Visual Studio 安装 LocalDB。

通常,SQL Server Express 不用于生产 web 应用程序。 不建议将 LocalDB 特别用于 web 应用程序,因为它不能与 IIS 一起使用。

  • 在本教程中,你将使用 LocalDB。 打开应用程序web.config文件,并在 appSettings 元素前面添加一个 connectionStrings 元素,如下面的示例中所示。 (请确保更新根项目文件夹中的web.config 文件。 "视图" 子文件夹中还有一个不需要更新的 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的 LocalDB 数据库。 (数据库尚不存在,但 EF 会创建它。)如果要在应用中创建数据库 _Data文件夹,可以将 AttachDBFilename=|DataDirectory|ContosoUniversity1.mdf 添加到连接字符串。 有关连接字符串的详细信息,请参阅SQL Server ASP.NET Web 应用程序的连接字符串

web.config 文件中,实际上不需要连接字符串。 如果没有提供连接字符串,实体框架会根据上下文类使用默认连接字符串。 有关详细信息,请参阅Code First 到新的数据库

九、创建控制器和视图

现在,您将创建一个网页来显示数据。 请求数据的过程会自动触发数据库的创建。 首先创建一个新的控制器。 但在执行此操作之前,请生成项目,使模型和上下文类可用于 MVC 控制器基架。

  1. 右键单击解决方案资源管理器中的 "控制器" 文件夹,选择 "添加",然后单击 "新建基架项"。

  2. 在 "添加基架" 对话框中,选择 "包含视图的 MVC 5 控制器,使用实体框架",然后选择 "添加"。

    在 Visual Studio 中添加基架对话框

  3. 在 "添加控制器" 对话框中,进行以下选择,然后选择 "添加":

    • Model 类: Student (ContosoUniversity) (如果未在下拉列表中看到此选项,请生成项目,然后重试。)

    • 数据上下文类: SchoolContext (ContosoUniversity)

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

    • 为其他字段保留默认值。

      单击 "添加" 时,scaffolder 会创建一个StudentController.cs文件和一组与控制器一起使用的视图(cshtml文件)。 在将来创建使用实体框架的项目时,还可以利用 scaffolder 的一些附加功能:创建第一个模型类,不要创建连接字符串,然后在 "添加控制器" 框中,通过选择 "数据上下文类" 旁边的 + 按钮来指定新的数据上下文 Scaffolder 将创建 DbContext 类和连接字符串以及控制器和视图。

  4. Visual Studio 将打开ControllersStudentController.cs文件。 你会看到已创建实例化数据库上下文对象的类变量:

    private SchoolContext db = new SchoolContext();
    

    Index 操作方法通过读取数据库上下文实例的 Students 属性,从学生实体集中获取学生列表:

    public ViewResult Index()
    {
        return View(db.Students.ToList());
    }
    

    StudentIndex.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 方法插入的测试数据。 根据浏览器窗口的大小,你会在顶部的地址栏中看到 "学生" 选项卡链接,或单击右上角以查看链接。

    菜单按钮

十、查看数据库

当你运行 "学生" 页且应用程序尝试访问数据库时,EF 发现没有数据库并创建了数据库。 然后,EF 运行 seed 方法来用数据填充数据库。

您可以使用服务器资源管理器SQL Server 对象资源管理器(SSOX)在 Visual Studio 中查看数据库。 对于本教程,你将使用服务器资源管理器

  1. 关闭浏览器。

  2. 服务器资源管理器中,展开 "数据连接" (可能需要首先选择 "刷新" 按钮),展开 "学校上下文(ContosoUniversity) ",然后展开 "" 以查看新数据库中的表。

  3. 右键单击Student表,然后单击 "显示表数据",查看已创建的列和插入到该表中的行。

  4. 关闭服务器资源管理器连接。

ContosoUniversity1.ldf数据库文件位于 % USERPROFILE% 文件夹中。

由于你使用的是 DropCreateDatabaseIfModelChanges 初始值设定项,因此你现在可以对 Student 类进行更改,然后再次运行应用程序,并将自动重新创建数据库以匹配你的更改。 例如,如果向 Student 类添加 EmailAddress 属性,请再次运行 "学生" 页,然后再次查看表,您将看到一个新的 EmailAddress 列。

十一、约定

您必须编写的代码量,以便实体框架能够为您创建完整数据库,这是因为约定或实体框架所做的假设。 其中一些内容已经过说明,或已被使用,无需注意它们:

  • 实体类名称的复数形式用作表名称。
  • 使用实体属性名作为列名。
  • 命名为 IDclassname ID 的实体属性被识别为主键属性。
  • 如果属性命名为 <导航属性名称><primary key 属性名称> (例如 StudentID 导航属性 Student,因为 Student 实体的主键是 ID),则该属性将被解释为外键属性。 也可以将外键属性命名为相同 <主键属性名称> (例如 EnrollmentID,因为 Enrollment 实体的主键是 EnrollmentID)。

你已了解到可以重写约定。 例如,你指定了表名不应为复数,稍后你将看到如何将属性显式标记为外键属性。

十二、获取代码

下载完成的项目

十三、其他资源

有关 EF 6 的详细信息,请参阅以下文章:

十四、后续步骤

在本教程中,你将了解:

  • 创建 MVC web 应用
  • 设置网站样式
  • 安装实体框架6
  • 已创建数据模型
  • 已创建数据库上下文
  • 已使用测试数据初始化数据库
  • 设置 EF 6 以使用 LocalDB
  • 已创建控制器和视图
  • 已查看数据库

转到下一篇文章,了解如何在控制器和视图中查看和自定义创建、读取、更新、删除(CRUD)代码。

原文地址:https://www.cnblogs.com/springsnow/p/13262970.html