使用 Entity Framework 4.0 Database First 和 ASP.NET 4 入门 Web Forms

作者 :Tom Dykstra

Contoso University 示例 Web 应用程序演示如何使用 Entity Framework 4.0 和 Visual Studio 2010 创建 ASP.NET Web Forms应用程序。 示例应用程序是虚构的 Contoso University 的网站。 它包括诸如学生入学、 课程创建和导师分配等功能。

本教程演示了 C# 中的示例。 可下载的示例包含 C# 和 Visual Basic 中的代码。

Database First

可通过三种方式处理实体框架中的数据: Database FirstModel FirstCode First。 本教程适用于 Database First。 有关这些工作流之间的差异以及如何为方案选择最佳工作流的指南的信息,请参阅 实体框架开发工作流

Web 窗体

本教程系列使用 ASP.NET Web Forms 模型,并假定你知道如何在 Visual Studio 中使用 ASP.NET Web Forms。 如果没有,请参阅使用 ASP.NET 4.5 Web Forms入门。 如果希望使用 ASP.NET MVC 框架,请参阅使用 ASP.NET MVC 通过实体框架入门

软件版本

教程中所示 也适用于
Windows 7 Windows 8
Visual Studio 2010 Visual Studio 2010 Express for Web。 本教程尚未使用更高版本的 Visual Studio 进行测试。 菜单选择、对话框和模板存在许多差异。
.NET 4 .NET 4.5 与 .NET 4 向后兼容,但本教程尚未使用 .NET 4.5 进行测试。
实体框架 4 本教程尚未使用更高版本的实体框架进行测试。 从 Entity Framework 5 开始,EF 默认 DbContext API 使用 EF 4.1 中引入的 。 EntityDataSource 控件旨在使用 ObjectContext API。 有关如何将 EntityDataSource 控件与 API 配合使用 DbContext 的信息,请参阅 此博客文章

问题

如果有与本教程不直接相关的问题,可以将其发布到 ASP.NET 实体框架论坛实体框架和 LINQ to Entities 论坛StackOverflow.com

概述

你将在这些教程中构建的应用程序是一个简单的大学网站。

Contoso University 主页的屏幕截图,其中显示了指向“主页”、“关于”、“学生”、“课程”、“讲师”和“系”页面的链接。

用户可以查看和更新学生、课程和讲师信息。 下面显示了你将创建的一些屏幕。

Image30

Image37

Image31

Image32

创建 Web 应用程序

若要开始本教程,请打开 Visual Studio,然后使用 ASP.NET Web 应用程序模板创建新的 ASP.NET Web 应用程序 项目:

Image01

此模板创建已包含样式表和母版页的 Web 应用程序项目:

Image02

打开 Site.Master 文件并将“我的 ASP.NET 应用程序”更改为“Contoso University”。

<h1>
    Contoso University
</h1>

找到名为 NavigationMenuMenu 控件,并将其替换为以下标记,以便为要创建的页面添加菜单项。

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false"
                    IncludeStyleBlock="false" Orientation="Horizontal">
                    <Items>
                        <asp:MenuItem NavigateUrl="~/Default.aspx" Text="Home" />
                        <asp:MenuItem NavigateUrl="~/About.aspx" Text="About" />
                        <asp:MenuItem NavigateUrl="~/Students.aspx" Text="Students">
                            <asp:MenuItem NavigateUrl="~/StudentsAdd.aspx" Text="Add Students" />
                        </asp:MenuItem>
                        <asp:MenuItem NavigateUrl="~/Courses.aspx" Text="Courses">
                            <asp:MenuItem NavigateUrl="~/CoursesAdd.aspx" Text="Add Courses" />
                        </asp:MenuItem>
                        <asp:MenuItem NavigateUrl="~/Instructors.aspx" Text="Instructors">
                            <asp:MenuItem NavigateUrl="~/InstructorsCourses.aspx" Text="Course Assignments" />
                            <asp:MenuItem NavigateUrl="~/OfficeAssignments.aspx" Text="Office Assignments" />
                        </asp:MenuItem>
                        <asp:MenuItem NavigateUrl="~/Departments.aspx" Text="Departments">
                            <asp:MenuItem NavigateUrl="~/DepartmentsAdd.aspx" Text="Add Departments" />
                        </asp:MenuItem>
                    </Items>
                </asp:Menu>

打开 Default.aspx 页,将名为 BodyContentContent控件更改为:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        Welcome to Contoso University!
   </h2>
</asp:Content>

现在,你有一个简单的主页,其中包含要创建的各种页面的链接:

Contoso University 主页的屏幕截图,其中显示了指向“主页”、“关于”、“学生”、“课程”、“讲师”和“系”页面的链接。

创建数据库

对于这些教程,你将使用实体框架数据模型设计器基于现有数据库自动创建数据模型 (通常称为数据库 优先 方法) 。 本系列教程中未介绍的替代方法是手动创建数据模型,然后让设计器生成创建数据库的脚本, (模型优先 方法) 。

对于本教程中使用的数据库优先方法,下一步是将数据库添加到站点。 最简单的方法是先下载本教程附带的项目。 然后右键单击 App_Data 文件夹,选择“ 添加现有项”,然后从下载的项目中选择 School.mdf 数据库文件。

另一种方法是按照 创建学校示例数据库中的说明进行操作。 无论是下载数据库还是创建数据库,请将 School.mdf 文件从以下文件夹复制到应用程序的 App_Data 文件夹:

%PROGRAMFILES%\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA

(.mdf 文件的此位置假定你使用的是 SQL Server 2008 Express.)

如果从脚本创建数据库,请执行以下步骤来创建数据库关系图:

  1. “服务器资源管理器”中,展开“ 数据连接”,展开“ School.mdf”,右键单击“ 数据库关系图”,然后选择“ 添加新关系图”。

    Image35

  2. 选择所有表,然后单击“ 添加”。

    Image36

    SQL Server创建一个数据库关系图,该关系图显示表、表中的列以及表之间的关系。 可以移动表格以按自己喜欢的方式组织它们。

  3. 将关系图另存为“学校关系图”并将其关闭。

如果下载本教程随附的 School.mdf 文件,可以通过在服务器资源管理器中双击“数据库关系图”下的“SchoolDiagram”来查看数据库关系图

Image38

此图如下所示, (表可能与此处显示的位置不同,) :

Image04

创建实体框架数据模型

现在,可以从此数据库创建实体框架数据模型。 可以在应用程序的根文件夹中创建数据模型,但在本教程中,你将它放置在名为 DAL (的文件夹中,以便数据访问层) 。

解决方案资源管理器,添加名为 DAL 的项目文件夹 (确保它位于项目下,而不是解决方案) 下。

右键单击 DAL 文件夹,然后选择“ 添加 ”和“ 新建项”。 在 “已安装的模板”下,选择“ 数据”,选择 ADO.NET 实体数据模型 模板,将其命名为 SchoolModel.edmx,然后单击“ 添加”。

Image05

这会启动实体数据模型向导。 在第一个向导步骤中,默认选择“ 从数据库生成 ”选项。 单击“下一步”。

Image06

“选择数据连接” 步骤中,保留默认值并单击“ 下一步”。 默认情况下,学校数据库处于选中状态,连接设置将作为 SchoolEntities 保存在Web.config文件中。

Image07

“选择数据库对象” 向导步骤中,选择除 (之外 sysdiagrams 的所有表,该表是为之前) 生成的关系图创建的,然后单击“ 完成”。

Image08

创建完模型后,Visual Studio 会显示实体框架对象的图形表示形式, (与数据库表相对应的实体) 。 (与数据库关系图一样,各个元素的位置可能与本图中显示的不同。如果需要,可以四处拖动元素以匹配插图。)

Image09

探索实体框架数据模型

可以看到实体关系图与数据库关系图非常相似,但存在一些差异。 一个区别是在每个关联的末尾添加符号,这些符号指示关联类型 (表关系在数据模型中称为实体关联) :

  • 一对零或一关联由“1”和“0..1”表示。

    Image39

    在这种情况下,实体 Person 可能与实体关联,也可能不关联 OfficeAssignment 。 实体 OfficeAssignment 必须与实体 Person 相关联。 换句话说,讲师可能被分配到办公室,也可能不分配给办公室,并且任何办公室只能分配给一个讲师。

  • 一对多关联由“1”和“*”表示。

    Image40

    在这种情况下,实体 Person 可能具有关联的实体,也可能没有关联的 StudentGrade 实体。 实体 StudentGrade 必须与一个 Person 实体相关联。 StudentGrade 实体实际上表示此数据库中已注册的课程;如果学生已注册课程,但还没有成绩,则 Grade 属性为 null。 换句话说,学生可能尚未注册任何课程,可能注册一门课程,或者可能注册多个课程。 注册课程中的每个年级仅适用于一名学生。

  • 多对多关联由“*”和“*”表示。

    Image41

    在这种情况下,实体 Person 可能具有关联的实体,也可能没有关联的 Course 实体,反之亦然:实体 Course 可能具有关联的实体,也可能没有关联的 Person 实体。 换句话说,一个讲师可以教授多个课程,一门课程可以由多个讲师教授。 (在此数据库中,此关系仅适用于讲师;它不会将学生链接到课程。学生通过 StudentGrades 表链接到课程)

数据库关系图和数据模型之间的另一个区别是每个实体的附加 导航属性 部分。 实体的导航属性引用相关实体。 例如,Courses实体中的 Person 属性包含与该Person实体相关的所有Course实体的集合。

Image12

数据库和数据模型之间的另一个区别是,数据库中没有 CourseInstructor 用于链接 Person 多对多关系中的 和 Course 表的关联表。 导航属性使你能够从Person实体获取相关Course实体,从Course实体获取相关Person实体,因此无需在数据模型中表示关联表。

Image11

在本教程中,假设 FirstName 表中的 Person 列实际上同时包含一个人的名字和中间名。 你想要更改字段的名称以反映这一点,但数据库管理员 (DBA) 可能不想更改数据库。 可以在数据模型中更改属性的名称 FirstName ,同时使其数据库等效项保持不变。

在设计器中,右键单击实体中的Person“FirstName”,然后选择“重命名”。

Image13

键入新名称“FirstMidName”。 这会更改你在代码中引用列的方式,而无需更改数据库。

Image29

模型浏览器提供了另一种方法来查看数据库结构、数据模型结构和它们之间的映射。 若要查看它,请右键单击实体设计器中的空白区域,然后单击“ 模型浏览器”。

Image18

模型浏览器 ”窗格显示树视图。 (“模型浏览器”窗格可能与解决方案资源管理器窗格停靠。) SchoolModel 节点表示数据模型结构,SchoolModel.Store 节点表示数据库结构。

Image26

展开 “SchoolModel.Store ”以查看表,展开“ 表/视图 ”以查看表,然后展开“ 课程 ”以查看表中的列。

Image19

展开 “SchoolModel”,展开“ 实体类型”,然后展开“ 课程” 节点以查看实体中的实体和属性。

Image20

在设计器或 模型浏览器 窗格中,可以看到实体框架如何关联两个模型的对象。 右键单击实体, Person 然后选择“ 表映射”。

Image21

这会打开 “映射详细信息” 窗口。 请注意,此窗口可让你看到数据库列 FirstNameFirstMidName映射到 ,即在数据模型中将其重命名为 的内容。

Image22

实体框架使用 XML 来存储有关数据库、数据模型以及它们之间的映射的信息。 SchoolModel.edmx 文件实际上是包含此信息的 XML 文件。 设计器以图形格式呈现信息,但你也可以通过在 解决方案资源管理器 中右键单击 .edmx 文件,单击“打开方式”,然后选择“XML (文本) 编辑器”,将该文件作为 XML 查看。 (数据模型设计器和 XML 编辑器只是打开和处理同一文件的两种不同方式,因此不能让设计器同时在 XML 编辑器中打开和打开文件。)

现已创建网站、数据库和数据模型。 在下一个演练中,你将开始使用数据模型和 ASP.NET EntityDataSource 控件处理数据。