ASP.NET Core와 EF Core를 사용하여 CRUD 연습하기
이 자습서에서는 컨트롤러와 뷰를 통해 ASP.NET Core MVC 및 Entity Framework Core에 대해 설명합니다. Razor Pages는 대체 프로그래밍 모델입니다. 새로 개발하는 경우에는 컨트롤러와 보기를 통해 MVC를 사용하는 것보다 Razor Pages를 사용할 것을 권장합니다. 이 자습서의 Razor Pages 버전을 참조하세요. 각 자습서는 다른 자습서에서 다루지 않는 일부 내용을 다룹니다.
이 MVC 자습서에는 Razor Pages 자습서에서 다루지 않는 몇 가지 사항이 있습니다.
- 데이터 모델에서 상속 구현
- 원시(raw) SQL 쿼리 수행
- 동적 LINQ를 사용하여 코드 단순화
Razor Pages 자습서에는 여기에서 다루지 않는 몇 가지 사항이 있습니다.
- Select 메서드를 사용하여 관련 데이터 로드
- EF Core 모범 사례
Contoso University 샘플 웹앱은 Entity Framework Core(줄여서, EF Core) 및 Visual Studio를 사용하여 ASP.NET Core MVC 웹앱을 만드는 방법을 보여 줍니다.
샘플 앱은 가상 Contoso University의 웹 사이트입니다. 학생 입학, 강좌 개설 및 강사 할당과 같은 기능이 있습니다. 이 페이지는 Contoso University 샘플 앱을 빌드하는 방법을 설명하는 자습서 시리즈 중 첫 번째입니다.
사전 요구 사항(Prerequisites)
- ASP.NET Core에 대한 기본적인 사용법을 알고 있다고 가정하고 강좌가 진행됩니다.
- 박용준 강사의 데이터베이스 사용 강좌는 Visual Studio 설치할 때 함께 설치되는 Windows에서만 실행되는 SQL Server Express 버전인 SQL Server LocalDB를 사용합니다.
Contoso University 웹앱
이러한 자습서에서 빌드한 앱은 기본 대학 웹 사이트입니다.
사용자는 학생, 강좌 및 강사 정보를 보고 업데이트할 수 있습니다. 다음은 앱의 몇 가지 화면입니다.
웹앱 만들기
- Visual Studio를 시작하고 새 프로젝트 만들기를 선택합니다.
- 새 프로젝트 만들기 대화 상자에서 ASP.NET Core 웹 애플리케이션 > 다음 을 선택합니다.
- 새 프로젝트 구성 대화 상자에서 프로젝트 이름으로
ContosoUniversity
를 입력합니다. 코드를 복사할 때namespace
가 일치하도록 대문자 표시를 포함하여 이 이름을 정확히 사용해야 합니다. - 만들기를 선택합니다.
- 새 ASP.NET Core 웹 애플리케이션 만들기 대화 상자에서 다음을 선택합니다
- 드롭다운에서 .NET Core와 ASP.NET Core 6.0을 선택합니다.
- ASP.NET Core 웹앱(Model-View-Controller) 프로젝트 템플릿을 선택합니다.
- 만들기 버튼을 클릭합니다.
사이트 스타일 설정
기본 프로젝트 템플릿에서 몇 가지 메뉴, 레이아웃 등을 변경합니다.
Views/Shared/_Layout.cshtml을 열고 다음과 같이 변경합니다.
- 각
ContosoUniversity
항목을Contoso University
로 변경합니다. 세 번 나옵니다. - 정보, 학생, 강좌, 강사, 부서 메뉴 항목을 추가하고 Privacy 메뉴 항목을 삭제합니다.
위의 변경 내용은 다음 코드에서 강조 표시됩니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - Contoso University</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">Contoso University</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="About">About</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Students" asp-action="Index">Students</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Courses" asp-action="Index">Courses</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Instructors" asp-action="Index">Instructors</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Departments" asp-action="Index">Departments</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2020 - Contoso University - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Views/Home/Index.cshtml에서 파일의 콘텐츠를 다음 태그로 바꿉니다.
@{
ViewData["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 Core in an
ASP.NET Core MVC 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 a series of tutorials.</p>
<p><a class="btn btn-default" href="https://docs.asp.net/en/latest/data/ef-mvc/intro.html">See the tutorial »</a></p>
</div>
<div class="col-md-4">
<h2>Download it</h2>
<p>You can download the completed project from GitHub.</p>
<p><a class="btn btn-default" href="https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/data/ef-mvc/intro/samples/5cu-final">See project source code »</a></p>
</div>
</div>
CTRL+F5 키를 눌러 프로젝트를 실행하거나 메뉴 모음에서 디버그 > 디버깅하지 않고 시작을 선택합니다. 이 자습서에서 만든 페이지의 탭과 함께 홈페이지가 표시됩니다.
EF Core NuGet 패키지
이 강의에서는 SQL Server를 사용합니다.
이 때 EF Core NuGet 패키지는 Microsoft.EntityFrameworkCore.SqlServer를 사용합니다.
PMC(패키지 관리자 콘솔)에서 다음 명령을 입력하여 NuGet 패키지를 추가합니다.
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
NuGet 패키지는 EF Core 오류 페이지에 대한 ASP.NET Core 미들웨어를 제공합니다. 이 미들웨어는 EF Core 마이그레이션의 오류를 검색 및 진단하는 데 도움이 됩니다.
데이터 모델 만들기
이 앱을 위해 다음 엔터티 클래스가 생성됩니다.
위의 엔터티에는 다음과 같은 관계가 있습니다.
Student
엔터티와Enrollment
엔터티 간의 일 대 다 관계. 학생 한 명이 여러 강좌에 등록할 수 있습니다.Course
엔터티와Enrollment
엔터티 간의 일 대 다 관계. 강좌는 등록된 학생이 여러 명일 수 있습니다.
다음 섹션에서 이러한 엔터티마다 클래스를 만듭니다.
학생(Student) 엔터티
Models 폴더에서 다음 코드로 Student
클래스를 만듭니다.
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 ICollection<Enrollment> Enrollments { get; set; }
}
}
Id
속성은 이 클래스에 해당하는 데이터베이스 테이블의 기본 키(PK) 열입니다. 기본적으로 EF는 이름이 Id
또는 classnameID
인 속성을 기본 키로 해석합니다. 예를 들어 PK 이름을 Id
대신 StudentId
로 지정할 수 있습니다.
The Enrollments
property is a navigation property. Navigation properties hold other entities that are related to this entity. The Enrollments
property of a Student
entity:
Enrollments
속성은 탐색 속성(navigation property)입니다. 탐색 속성은 이 엔터티와 관련된 다른 엔터티를 포함합니다.
Student 엔터티의 Enrollments 속성은 다음을 나타냅니다.
- 해당
Student
엔터티와 관련된 모든Enrollment
엔터티를 포함합니다. - 데이터베이스의 특정
Student
행에 두 개의 관련Enrollment
행이 있는 경우:- 이
Student
엔터티의Enrollments
탐색 속성은 이러한 두 개의Enrollment
엔터티를 포함합니다.
- 이
Enrollment
행은 StudentID
외래 키(FK) 열에 학생의 PK 값을 포함합니다.
탐색 속성 하나에 여러 엔터티가 있을 수 있는 경우:
- 형식은
ICollection<T>
,List<T>
,HashSet<T>
과 같은 목록이어야 합니다. - 엔터티는 추가, 삭제, 업데이트할 수 있습니다.
다 대 다(many-to-many) 및 일 대 다(one-to-many) 탐색 관계는 여러 엔터티를 포함할 수 있습니다. ICollection<T>
이 사용되는 경우 EF는 기본적으로 HashSet<T>
컬렉션을 만듭니다.