Migrations
개발자가 새 application을 개발할 때, data model이 자주 변경된다. model을 변경할 수록 database와 sync가 맞지 않게된다. 이 튜토리얼을 시작단계에서, EF 설정을 하면서 없었던 database를 생성했다. 이후로, data model이 변경되면 database를 지우고 EF는 data model에 맞는 database를 생성하고 test data를 주입한다.
이 방법은, application을 production 상태로 배포하기 전까지 사용할 수 있다. production 상태의 서비스는 유지해야 하는 데이터를 저장하기 때문에, 새 컬럼을 추가할 때마다 모든 데이터를 날릴 수는 없다. EF Migration은 database를 지우고 다시 만드는 방법이 아닌, database schema를 update하므로 이 문제를 해결한다.
Drop the database
터미널에서 EF Core tools을 global로 설치하고 database를 삭제한다.
dotnet tool install --global dotnet-ef
dotnet ef database drop
최초 migration 생성
프로젝트 경로에서, 터미널에 아래 command를 실행한다.
dotnet ef migrations add InitialCreate
Up, Down 함수
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace WEB.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Course",
columns: table => new
{
CourseID = table.Column<int>(type: "int", nullable: false),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
Credits = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Course", x => x.CourseID);
});
migrationBuilder.CreateTable(
name: "Student",
columns: table => new
{
ID = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
LastName = table.Column<string>(type: "nvarchar(max)", nullable: true),
FirstMidName = table.Column<string>(type: "nvarchar(max)", nullable: true),
EnrollmentDate = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Student", x => x.ID);
});
migrationBuilder.CreateTable(
name: "Enrollment",
columns: table => new
{
EnrollmentID = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
CourseID = table.Column<int>(type: "int", nullable: false),
StudentID = table.Column<int>(type: "int", nullable: false),
Grade = table.Column<int>(type: "int", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Enrollment", x => x.EnrollmentID);
table.ForeignKey(
name: "FK_Enrollment_Course_CourseID",
column: x => x.CourseID,
principalTable: "Course",
principalColumn: "CourseID",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_Enrollment_Student_StudentID",
column: x => x.StudentID,
principalTable: "Student",
principalColumn: "ID",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Enrollment_CourseID",
table: "Enrollment",
column: "CourseID");
migrationBuilder.CreateIndex(
name: "IX_Enrollment_StudentID",
table: "Enrollment",
column: "StudentID");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Enrollment");
migrationBuilder.DropTable(
name: "Course");
migrationBuilder.DropTable(
name: "Student");
}
}
}
up 함수는 migration을 위한 data model 변경사항을 구현한다. update를 rollback하면 down 함수를 호출한다.
database가 존재하는 상태에서 initial migration을 생성하면 database 생성코드는 생성되지만, 싱크가 맞지 않기 때문에 실행되지 않는다.
The data model snapshot
Migration은 Migrations/SchoolContextModelSnapshot.cs 파일에 현재 database schema에 대해서 snapshot을 생성한다. migration을 추가하면, EF는 data model과 snapshot 파일을 비교해서 변경사항을 결정한다.
dotnet ef migrations remove 명령어를 실행하면, migration을 삭제하고 snapshot을 reset한다. dotnet ef migrations remove가 실패하면 -v option을 붙여서 자세한 정보를 확인한다.
Apply the migration
dotnet ef database update
migration을 database에 반영한다.
'Entity Framework Core' 카테고리의 다른 글
.NET Core MVC] EF Core - 6.related data CRUD (0) | 2023.08.28 |
---|---|
.NET Core MVC] EF Core - 5.복잡한 data model 생성 (0) | 2023.08.07 |
.NET Core MVC] EF Core - 3.정렬, 검색, 페이징 (0) | 2023.08.01 |
.NET Core MVC] EF Core - 2.CRUD (0) | 2023.07.31 |
.NET Core MVC] EF Core - 1.기본설정(Model, DbContext) (0) | 2023.07.27 |
댓글