NET 4.0, MVC 3, Entity Framework 4.1, Visual Studio 2010. Source: ASP.NET site
... Creating an Entity Framework Data Model for an ASP.NET MVC Application.
Getting Started with the Entity Framework 4.1 Using ASP.NET MVC Tom Dykstra
Summary: In this book, you'll learn the basics of using Entity Framework Code First to display and edit data in an ASP.NET MVC application. Category: Step-by-Step Applies to: ASP.NET 4.0, MVC 3, Entity Framework 4.1, Visual Studio 2010 Source: ASP.NET site (link to source content) E-book publication date: June 2012
Copyright © 2012 by Microsoft Corporation All rights reserved. No part of the contents of this book may be reproduced or transmitted in any form or by any means without the written permission of the publisher.
Microsoft and the trademarks listed at http://www.microsoft.com/about/legal/en/us/IntellectualProperty/Trademarks/EN-US.aspx are trademarks of the Microsoft group of companies. All other marks are property of their respective owners. The example companies, organizations, products, domain names, email addresses, logos, people, places, and events depicted herein are fictitious. No association with any real company, organization, product, domain name, email address, logo, person, place, or event is intended or should be inferred. This book expresses the author’s views and opinions. The information contained in this book is provided without any express, statutory, or implied warranties. Neither the authors, Microsoft Corporation, nor its resellers, or distributors will be held liable for any damages caused or alleged to be caused either directly or indirectly by this book.
2
Contents Creating an Entity Framework Data Model for an ASP.NET MVC Application............................................................. 7 The Contoso University Web Application......................................................................................................................... 7 Entity Framework Development Approaches .............................................................................................................. 11 Database First ........................................................................................................................................................................... 12 Model First ................................................................................................................................................................................. 12 Code First ................................................................................................................................................................................... 13 POCO (Plain Old CLR Objects) ........................................................................................................................................... 13 Creating an MVC Web Application .................................................................................................................................. 13 Setting Up the Site Style....................................................................................................................................................... 15 Creating the Data Model...................................................................................................................................................... 18 The Student Entity................................................................................................................................................................... 19 The Enrollment Entity ............................................................................................................................................................ 21 The Course Entity .................................................................................................................................................................... 22 Creating the Database Context ......................................................................................................................................... 23 Setting the Connection String............................................................................................................................................ 24 Initializing the Database with Test Data......................................................................................................................... 24 Creating a Student Controller ............................................................................................................................................ 27 Conventions............................................................................................................................................................................... 33 Implementing Basic CRUD Functionality.................................................................................................................................. 35 Creating a Details Page......................................................................................................................................................... 39 Creating a Create Page ......................................................................................................................................................... 43 Creating an Edit Page ............................................................................................................................................................ 47 Entity States and the Attach and SaveChanges Methods ....................................................................................... 48 Creating a Delete Page ......................................................................................................................................................... 51 Ensuring that Database Connections Are Not Left Open ....................................................................................... 56 Sorting, Filtering, and Paging ....................................................................................................................................................... 57 Adding Column Sort Links to the Students Index Page .......................................................................................... 58 Adding Sorting Functionality to the Index Method .................................................................................................. 58
3
Adding Column Heading Hyperlinks to the Student Index View......................................................................... 60 Adding a Search Box to the Students Index Page ..................................................................................................... 62 Adding Filtering Functionality to the Index Method................................................................................................. 62 Adding a Search Box to the Student Index View........................................................................................................ 63 Adding Paging to the Students Index Page ................................................................................................................. 64 Installing the PagedList NuGet Package ........................................................................................................................ 65 Adding Paging Functionality to the Index Method ................................................................................................... 66 Adding Paging Links to the Student Index View ........................................................................................................ 69 Creating an About Page That Shows Student Statistics .......................................................................................... 73 Creating the View Model ..................................................................................................................................................... 74 Modifying the Home Controller ........................................................................................................................................ 74 Modifying the About View .................................................................................................................................................. 75 Creating a More Complex Data Model..................................................................................................................................... 78 Using Attributes to Control Formatting, Validation, and Database Mapping ................................................ 79 The DisplayFormat Attribute............................................................................................................................................... 79 The MaxLength Attribute ..................................................................................................................................................... 81 The Column Attribute ............................................................................................................................................................ 83 Creating the Instructor Entity ............................................................................................................................................. 85 The Required and Display Attributes .............................................................................................................................. 86 The FullName Calculated Property................................................................................................................................... 86 The Courses and OfficeAssignment Navigation Properties ................................................................................... 87 Creating the OfficeAssignment Entity ............................................................................................................................. 87 The Key Attribute .................................................................................................................................................................... 88 The Instructor Navigation Property ................................................................................................................................. 88 Modifying the Course Entity ............................................................................................................................................... 89 The DatabaseGenerated Attribute.................................................................................................................................... 90 Foreign Key and Navigation Properties ......................................................................................................................... 90 Creating the Department Entity ........................................................................................................................................ 91 The Column Attribute ............................................................................................................................................................ 92 Foreign Key and Navigation Properties ......................................................................................................................... 92 Modifying the Student Entity ............................................................................................................................................. 93 Modifying the Enrollment Entity ....................................................................................................................................... 94
4
Foreign Key and Navigation Properties ......................................................................................................................... 95 Many-to-Many Relationships ............................................................................................................................................. 96 The DisplayFormat Attribute............................................................................................................................................... 99 Entity Diagram Showing Relationships........................................................................................................................... 99 Customizing the Database Context ............................................................................................................................... 101 Initializing the Database with Test Data....................................................................................................................... 102 Dropping and Re-Creating the Database.................................................................................................................... 107 Reading Related Data .................................................................................................................................................................... 111 Lazy, Eager, and Explicit Loading of Related Data ................................................................................................... 112 Creating a Courses Index Page That Displays Department Name .................................................................... 114 Creating an Instructors Index Page That Shows Courses and Enrollments.................................................... 118 Creating a View Model for the Instructor Index View ............................................................................................ 120 Adding a Style for Selected Rows................................................................................................................................... 120 Creating the Instructor Controller and Views ............................................................................................................ 121 Modifying the Instructor Index View ............................................................................................................................. 124 Adding Explicit Loading ...................................................................................................................................................... 131 Updating Related Data .................................................................................................................................................................. 135 Customizing the Create and Edit Pages for Courses .............................................................................................. 138 Adding an Edit Page for Instructors............................................................................................................................... 146 Adding Course Assignments to the Instructor Edit Page...................................................................................... 153 Handling Concurrency................................................................................................................................................................... 163 Concurrency Conflicts.......................................................................................................................................................... 165 Pessimistic Concurrency (Locking) ................................................................................................................................. 165 Optimistic Concurrency ...................................................................................................................................................... 165 Detecting Concurrency Conflicts .................................................................................................................................... 169 Adding a Tracking Property to the Department Entity .......................................................................................... 170 Creating a Department Controller.................................................................................................................................. 171 Testing Optimistic Concurrency Handling .................................................................................................................. 175 Adding a Delete Page.......................................................................................................................................................... 184 Implementing Inheritance............................................................................................................................................................ 194 Table-per-Hierarchy versus Table-per-Type Inheritance ...................................................................................... 194 Creating the Person Class .................................................................................................................................................. 196
5
Adding the Person Entity Type to the Model ............................................................................................................ 198 Changing InstructorID and StudentID to PersonID ................................................................................................. 199 Adjusting Primary Key Values in the Initializer .......................................................................................................... 199 Changing OfficeAssignment to Lazy Loading............................................................................................................ 200 Testing ....................................................................................................................................................................................... 200 Implementing the Repository and Unit of Work Patterns .............................................................................................. 203 The Repository and Unit of Work Patterns ................................................................................................................. 203 Creating the Student Repository Class ......................................................................................................................... 205 Changing the Student Controller to Use the Repository ...................................................................................... 208 Implementing a Generic Repository and a Unit of Work Class .......................................................................... 216 Creating a Generic Repository ......................................................................................................................................... 216 Creating the Unit of Work Class ...................................................................................................................................... 221 Changing the Course Controller to use the UnitOfWork Class and Repositories ....................................... 224 Advanced Scenarios ....................................................................................................................................................................... 231 Performing Raw SQL Queries ........................................................................................................................................... 233 Calling a Query that Returns Entities............................................................................................................................. 233 Calling a Query that Returns Other Types of Objects ............................................................................................ 235 Calling an Update Query .................................................................................................................................................... 237 No-Tracking Queries ............................................................................................................................................................ 244 Examining Queries Sent to the Database .................................................................................................................... 249 Working with Proxy Classes .............................................................................................................................................. 253 Disabling Automatic Detection of Changes ............................................................................................................... 254 Disabling Validation When Saving Changes .............................................................................................................. 254 Links to Entity Framework Resources ............................................................................................................................ 254
6
Creating an Entity Framework Data Model for an ASP.NET MVC Application The Contoso University sample web application demonstrates how to create ASP.NET MVC applications using the Entity Framework. The sample application is a website for a fictional Contoso University. It includes functionality such as student admission, course creation, and instructor assignments. This tutorial series explains the steps taken to build the Contoso University sample application. You can download the completed application or create it by following the steps in the tutorial. The tutorial shows examples in C#. The downloadable sample contains code in both C# and Visual Basic. If you have questions that are not directly related to the tutorial, you can post them to the ASP.NET Entity Framework forum or the Entity Framework and LINQ to Entities forum. This tutorial series assumes you know how to work with ASP.NET MVC in Visual Studio. If you don’t, a good place to start is a basic ASP.NET MVC Tutorial. If you prefer to work with the ASP.NET Web Forms model, see the Getting Started with the Entity Framework and Continuing with the Entity Framework tutorials. Before you start, make sure you have the following software installed on your computer:
•
Visual Studio 2010 SP1 or Visual Web Developer Express 2010 SP1 (If you use one of these links, the following items will be installed automatically.)
•
ASP.NET MVC 3 Tools Update
•
Microsoft SQL Server Compact 4.0
•
Microsoft Visual Studio 2010 SP1 Tools for SQL Server Compact 4.0
The Contoso University Web Application The application you'll be building in these tutorials is a simple university website.
7
Users can view and update student, course, and instructor information. A few of the screens you'll create are shown below.
8
9
10
The UI style of this site has been kept close to what's generated by the built-in templates, so that the tutorial can focus mainly on how to use the Entity Framework.
Entity Framework Development Approaches 11
As shown in the following diagram, there are three ways you can work with data in the Entity Framework: Database First, Model First, and Code First.
Database First If you already have a database, the Entity Framework can automatically generate a data model that consists of classes and properties that correspond to existing database objects such as tables and columns. The information about your database structure (store schema), your data model (conceptual model), and the mapping between them is stored in XML in an .edmx file. Visual Studio provides the Entity Framework designer, which is a graphical designer that you can use to display and edit the .edmx file. The Getting Started With the Entity Framework and Continuing With the Entity Frameworktutorial sets use Database First development.
Model First
12
If you don't yet have a database, you can begin by creating a model using the Entity Framework designer in Visual Studio. When the model is finished, the designer can generate DDL (data definition language) statements to create the database. This approach also uses an .edmx file to store model and mapping information. The What's New in the Entity Framework 4 tutorial includes a brief example of Model First development.
Code First Whether you have an existing database or not, you can code your own classes and properties that correspond to tables and columns and use them with the Entity Framework without an .edmx file. That's why you sometimes see this approach called code only, although the official name is Code First. The mapping between the store schema and the conceptual model represented by your code is handled by convention and by a special mapping API. If you don't yet have a database, the Entity Framework can automatically create the database for you, or drop and re-create it if the model changes. This tutorial series uses Code First development. The data access API that was developed for Code First is based on the DbContext class. This API can also be used with the Database First and Model First development workflows. For more information, see When is Code First not code first? on the Entity Framework team blog.
POCO (Plain Old CLR Objects) By default, when you use the Database First or Model First development approaches, the entity classes in your data model inherit from the EntityObject class, which provides them with Entity Framework functionality. This means that these classes technically aren't persistence ignorant and so don't conform fully to one of the requirements of domain-driven design. All development approaches of the Entity Framework can also work with POCO (plain old CLR objects) classes, which essentially means that they are persistence-ignorant because they don't inherit from the EntityObject class. In this tutorial you'll use POCO classes.
Creating an MVC Web Application Before you start, make sure you have the following installed on your computer:
•
Visual Studio 2010 SP1 or Visual Web Developer Express 2010 SP1 (If you use one of these links, the following items will be installed automatically.)
•
ASP.NET MVC 3 Tools Update
•
Microsoft SQL Server Compact 4.0
•
Microsoft Visual Studio 2010 SP1 Tools for SQL Server Compact 4.0
13
Open Visual Studio and create a new project named "ContosoUniversity" using the ASP.NET MVC 3 Web Application template:
In the New ASP.NET MVC 3 Project dialog box select the Internet Application template and the Razor view engine, clear the Create a unit test project check box, and then click OK.
14
Setting Up the Site Style A few simple changes will set up the site menu, layout, and home page. In order to set up the Contoso University menu, in the Views\Shared\_Layout.cshtml file, replace the existing h1 heading text and the menu links, as shown in the following example:
15
@ViewBag.Title
Contoso University
@Html.Partial("_LogOnPartial")