Nguon: Microsoft Learn · .NET 8.0

Phần 5: Áp dụng Migrations - ASP.NET MVC với EF Core

Nguồn: Tutorial Part 5, apply migrations to the Contoso University sample

Trong hướng dẫn này, bạn bắt đầu sử dụng tính năng EF Core migrations (di chuyển) để quản lý các thay đổi mô hình dữ liệu. Trong các hướng dẫn sau, bạn sẽ thêm nhiều migration khi thay đổi mô hình dữ liệu.

Trong hướng dẫn này, bạn:

Điều kiện tiên quyết

Giới thiệu về Migrations

Khi bạn phát triển một ứng dụng mới, mô hình dữ liệu thay đổi thường xuyên, và mỗi khi mô hình thay đổi, nó không còn đồng bộ với cơ sở dữ liệu. Bạn đã bắt đầu các hướng dẫn này bằng cách cấu hình Entity Framework để tạo cơ sở dữ liệu nếu nó chưa tồn tại. Sau đó mỗi khi bạn thay đổi mô hình dữ liệu -- thêm, xóa hoặc thay đổi các entity class (lớp thực thể) hoặc thay đổi lớp DbContext -- bạn có thể xóa cơ sở dữ liệu và EF tạo một cơ sở dữ liệu mới khớp với mô hình, và nạp dữ liệu kiểm tra vào đó.

Phương pháp giữ cho cơ sở dữ liệu đồng bộ với mô hình dữ liệu này hoạt động tốt cho đến khi bạn triển khai ứng dụng vào môi trường production. Khi ứng dụng chạy trong production, nó thường lưu trữ dữ liệu mà bạn muốn giữ lại, và bạn không muốn mất mọi thứ mỗi khi bạn thực hiện một thay đổi như thêm một cột mới. Tính năng EF Core Migrations giải quyết vấn đề này bằng cách cho phép EF cập nhật schema (lược đồ) cơ sở dữ liệu thay vì tạo cơ sở dữ liệu mới.

Để làm việc với migrations, bạn có thể sử dụng Package Manager Console (PMC - Bảng điều khiển Quản lý Gói) hoặc CLI (Command Line Interface - Giao diện dòng lệnh). Các hướng dẫn này trình bày cách sử dụng các lệnh CLI. Thông tin về PMC ở cuối hướng dẫn này.

Xóa cơ sở dữ liệu

Cài đặt EF Core tools (công cụ) như một global tool và xóa cơ sở dữ liệu:

dotnetcli
dotnet tool install --global dotnet-ef
dotnet ef database drop

Lưu ý: Theo mặc định, kiến trúc của các nhị phân .NET cần cài đặt đại diện cho kiến trúc hệ điều hành đang chạy hiện tại. Để chỉ định một kiến trúc khác, hãy xem cách sử dụng lệnh dotnet tool install với tùy chọn --arch.

Tạo migration ban đầu

Lưu các thay đổi của bạn và build dự án. Sau đó mở một cửa sổ lệnh và điều hướng đến thư mục dự án. Đây là cách nhanh để làm điều đó:

Nhập lệnh sau trong cửa sổ lệnh:

dotnetcli
dotnet ef migrations add InitialCreate

Trong các lệnh trên, output tương tự như sau được hiển thị:

console
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'

Nếu bạn thấy thông báo lỗi "cannot access the file ... ContosoUniversity.dll because it is being used by another process.", tìm biểu tượng IIS Express trong Windows System Tray, nhấp chuột phải vào nó, sau đó nhấp ContosoUniversity > Stop Site.

Kiểm tra các phương thức Up và Down

Khi bạn thực thi lệnh migrations add, EF đã tạo mã để tạo cơ sở dữ liệu từ đầu. Mã này nằm trong thư mục Migrations, trong file có tên <timestamp>_InitialCreate.cs. Phương thức Up của class InitialCreate tạo các bảng cơ sở dữ liệu tương ứng với các entity set (tập thực thể) mô hình dữ liệu, và phương thức Down xóa chúng, như được hiển thị trong ví dụ sau:

csharp
public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Course",
            columns: table => new
            {
                CourseID = table.Column<int>(nullable: false),
                Credits = table.Column<int>(nullable: false),
                Title = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Course", x => x.CourseID);
            });

        // Additional code not shown
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Enrollment");
        // Additional code not shown
    }
}

Migrations gọi phương thức Up để triển khai các thay đổi mô hình dữ liệu cho một migration. Khi bạn nhập lệnh để rollback (hoàn tác) cập nhật, Migrations gọi phương thức Down.

Mã này dành cho migration ban đầu được tạo khi bạn nhập lệnh migrations add InitialCreate. Tham số tên migration ("InitialCreate" trong ví dụ) được sử dụng cho tên file và có thể là bất kỳ thứ gì bạn muốn. Tốt nhất là chọn một từ hoặc cụm từ tóm tắt những gì đang được thực hiện trong migration. Ví dụ: bạn có thể đặt tên cho migration sau là "AddDepartmentTable".

Nếu bạn đã tạo migration ban đầu khi cơ sở dữ liệu đã tồn tại, mã tạo cơ sở dữ liệu được tạo ra nhưng không cần chạy vì cơ sở dữ liệu đã khớp với mô hình dữ liệu. Khi bạn triển khai ứng dụng vào một môi trường khác nơi cơ sở dữ liệu chưa tồn tại, mã này sẽ chạy để tạo cơ sở dữ liệu của bạn, vì vậy nên kiểm tra trước. Đó là lý do tại sao bạn đã xóa cơ sở dữ liệu trước đó -- để migrations có thể tạo một cơ sở dữ liệu mới từ đầu.

Snapshot mô hình dữ liệu

Migrations tạo một snapshot (ảnh chụp) của schema cơ sở dữ liệu hiện tại trong Migrations/SchoolContextModelSnapshot.cs. Khi bạn thêm một migration, EF xác định những gì đã thay đổi bằng cách so sánh mô hình dữ liệu với file snapshot.

Sử dụng lệnh dotnet ef migrations remove để xóa một migration. dotnet ef migrations remove xóa migration và đảm bảo snapshot được đặt lại đúng cách. Nếu dotnet ef migrations remove thất bại, sử dụng dotnet ef migrations remove -v để biết thêm thông tin về lỗi.

Áp dụng migration

Trong cửa sổ lệnh, nhập lệnh sau để tạo cơ sở dữ liệu và các bảng trong đó:

dotnetcli
dotnet ef database update

Output từ lệnh tương tự như lệnh migrations add, ngoại trừ bạn thấy các log cho các lệnh SQL thiết lập cơ sở dữ liệu. Hầu hết các log được bỏ qua trong output mẫu sau. Nếu bạn thích không thấy mức chi tiết này trong các thông báo log, bạn có thể thay đổi cấp độ log trong file appsettings.Development.json.

text
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      CREATE DATABASE [ContosoUniversity2];
...
Done.

Sử dụng SQL Server Object Explorer để kiểm tra cơ sở dữ liệu như bạn đã làm trong hướng dẫn đầu tiên. Bạn sẽ nhận thấy việc thêm bảng \_\_EFMigrationsHistory theo dõi các migration nào đã được áp dụng cho cơ sở dữ liệu. Xem dữ liệu trong bảng đó và bạn sẽ thấy một hàng cho migration đầu tiên.

Chạy ứng dụng để xác minh rằng mọi thứ vẫn hoạt động như trước.

So sánh CLI và PMC

Công cụ EF để quản lý migrations có sẵn từ các lệnh .NET CLI hoặc từ các cmdlet PowerShell trong cửa sổ Package Manager Console (PMC) của Visual Studio. Hướng dẫn này trình bày cách sử dụng CLI, nhưng bạn có thể sử dụng PMC nếu bạn thích.

Các lệnh EF cho các lệnh PMC có trong gói Microsoft.EntityFrameworkCore.Tools. Gói này được bao gồm trong Microsoft.AspNetCore.App metapackage, vì vậy bạn không cần thêm tham chiếu gói nếu ứng dụng của bạn có tham chiếu gói cho Microsoft.AspNetCore.App.

Quan trọng: Đây không phải là cùng một gói với gói bạn cài đặt cho CLI bằng cách chỉnh sửa file .csproj. Tên của gói này kết thúc bằng Tools, không giống như tên gói CLI kết thúc bằng Tools.DotNet.

Để biết thêm thông tin về các lệnh CLI, xem .NET CLI.

Để biết thêm thông tin về các lệnh PMC, xem Package Manager Console (Visual Studio).

Lấy mã nguồn

Tải xuống hoặc xem ứng dụng hoàn chỉnh.