ASP.NET Core와 EF Core를 사용하여 CRUD 연습하기

  • 9 minutes to read

이 자습서에서는 컨트롤러와 뷰를 통해 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 웹앱

이러한 자습서에서 빌드한 앱은 기본 대학 웹 사이트입니다.

사용자는 학생, 강좌 및 강사 정보를 보고 업데이트할 수 있습니다. 다음은 앱의 몇 가지 화면입니다.

Students Index page

Students Edit page

웹앱 만들기

  1. Visual Studio를 시작하고 새 프로젝트 만들기를 선택합니다.
  2. 새 프로젝트 만들기 대화 상자에서 ASP.NET Core 웹 애플리케이션 > 다음 을 선택합니다.
  3. 새 프로젝트 구성 대화 상자에서 프로젝트 이름으로 ContosoUniversity를 입력합니다. 코드를 복사할 때 namespace가 일치하도록 대문자 표시를 포함하여 이 이름을 정확히 사용해야 합니다.
  4. 만들기를 선택합니다.
  5. 새 ASP.NET Core 웹 애플리케이션 만들기 대화 상자에서 다음을 선택합니다
    1. 드롭다운에서 .NET CoreASP.NET Core 6.0을 선택합니다.
    2. ASP.NET Core 웹앱(Model-View-Controller) 프로젝트 템플릿을 선택합니다.
    3. 만들기 버튼을 클릭합니다. New ASP.NET Core Project dialog

사이트 스타일 설정

기본 프로젝트 템플릿에서 몇 가지 메뉴, 레이아웃 등을 변경합니다.

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">
            &copy; 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 &raquo;</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 &raquo;</a></p>
    </div>
</div>

CTRL+F5 키를 눌러 프로젝트를 실행하거나 메뉴 모음에서 디버그 > 디버깅하지 않고 시작을 선택합니다. 이 자습서에서 만든 페이지의 탭과 함께 홈페이지가 표시됩니다.

Contoso University home page

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 마이그레이션의 오류를 검색 및 진단하는 데 도움이 됩니다.

데이터 모델 만들기

이 앱을 위해 다음 엔터티 클래스가 생성됩니다.

Course-Enrollment-Student data model diagram

위의 엔터티에는 다음과 같은 관계가 있습니다.

  • Student 엔터티와 Enrollment 엔터티 간의 일 대 다 관계. 학생 한 명이 여러 강좌에 등록할 수 있습니다.
  • Course 엔터티와 Enrollment 엔터티 간의 일 대 다 관계. 강좌는 등록된 학생이 여러 명일 수 있습니다.

다음 섹션에서 이러한 엔터티마다 클래스를 만듭니다.

학생(Student) 엔터티

Student entity diagram

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> 컬렉션을 만듭니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com