ASP.NET Core: Áp dụng migration


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Trong bài viết này

  1. Điều kiện tiên quyết
  2. Giới thiệu về migration
  3. Bỏ cơ sở dữ liệu
  4. Tạo migration ban đầu
  5. Kiểm tra các phương pháp Lên và Xuống
  6. Snapshot mô hình dữ liệu
  7. Áp dụng migration
  8. So sánh CLI và PMC
  9. Lấy mã
  10. Bước tiếp theo

Trong hướng dẫn này, bạn bắt đầu sử dụng tính năng migration EF Core để 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 lần migration hơn khi thay đổi mô hình dữ liệu.

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

  • Tìm hiểu về migration
  • Tạo migration ban đầu
  • Kiểm tra các phương thức Up và Down
  • Tìm hiểu về snapshot mô hình dữ liệu
  • Áp dụng migration

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

Giới thiệu về migration

Khi bạn phát triển một ứng dụng mới, mô hình dữ liệu của bạn thay đổi thường xuyên và mỗi lần mô hình thay đổi, mô hình đó sẽ không đồ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 định cấu hình Entity Framework để tạo cơ sở dữ liệu nếu nó không 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 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 phù hợp với mô hình và tạo dữ liệu thử nghiệm cho nó.

Phương pháp giữ cơ sở dữ liệu đồng bộ hóa 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 production. Khi ứng dụng đang chạy trong quá trình 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 thực hiện thay đổi, chẳng hạn như thêm 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 lược đồ cơ sở dữ liệu thay vì tạo cơ sở dữ liệu mới.

Để làm việc với quá trình migration, bạn có thể sử dụng Package Manager Console (PMC) hoặc CLI. Những hướng dẫn này cho thấy cách sử dụng lệnh CLI. Thông tin về PMC có ở cuối hướng dẫn này.

Bỏ cơ sở dữ liệu

Cài đặt công cụ EF Core làm công cụ global và xóa cơ sở dữ liệu:

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

Ghi chú

Theo mặc định, kiến ​​trúc của các tệp nhị phân .NET cần cài đặt đại diện cho kiến ​​trúc hệ điều hành hiện đang chạy. Để chỉ định kiến ​​trúc hệ điều hành khác, hãy xem cài đặt công cụ dotnet, tùy chọn --arch. Để biết thêm thông tin, hãy xem vấn đề GitHub dotnet/AspNetCore.Docs #29262.

Phần sau đây giải thích cách chạy lệnh CLI.

Tạo migration ban đầu

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

  • Trong Solution Explorer, nhấp chuột phải vào dự án và chọn Open Folder in File Explorer từ menu ngữ cảnh.

    Mở trong mục menu File Explorer

  • Nhập "cmd" vào thanh địa chỉ và nhấn Enter.

    Mở cửa sổ lệnh với cmd

Nhập lệnh sau vào cửa sổ lệnh:

dotnet ef migrations add InitialCreate

Đầu ra tương tự như sau được hiển thị:

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.", hãy tìm biểu tượng IIS Express trong Khay Hệ thống Windows và nhấp chuột phải vào tệp đó, sau đó nhấp vào 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 tệp có tên <timestamp>_InitialCreate.cs. Phương thức Up của của InitialCreate tạo các bảng cơ sở dữ liệu tương ứng với các tập thực thể mô hình dữ liệu và phương thức Down xóa chúng, như trong ví dụ sau.

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 quá trình migration. Khi bạn nhập lệnh để khôi phục bản cập nhật, Migrations sẽ gọi phương thức Down.

Mã trên là dành cho lần 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 tệp và có thể là bất cứ điều gì bạn muốn. Tốt nhất nên chọn một từ hoặc cụm từ tóm tắt những gì đang được thực hiện trong quá trình migration. Ví dụ: bạn có thể đặt tên cho lần migration sau này là "AddDepartmentTable".

Nếu bạn đã tạo quá trình migration ban đầu khi cơ sở dữ liệu đã tồn tại thì mã tạo cơ sở dữ liệu sẽ được tạo nhưng mã này không cần phải 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 đến 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 bạn nên kiểm tra nó trước. Đó là lý do tại sao bạn đã bỏ cơ sở dữ liệu trước đó -- để quá trình migration có thể tạo cơ sở dữ liệu mới từ đầu.

Snapshot mô hình dữ liệu

Quá trình migration tạo snapshot của lược đồ cơ sở dữ liệu hiện tại ở định dạng Migrations/SchoolContextModelSnapshot.cs. Khi bạn thêm 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 tệp snapshot.

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

Xem Migration cốt lõi của EF trong Môi trường nhóm để biết thêm thông tin về cách sử dụng tệp snapshot.

Á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 đó.

dotnet ef database update

Đầu ra từ lệnh tương tự như lệnh migrations add, ngoại trừ việc bạn thấy nhật ký cho các lệnh SQL thiết lập cơ sở dữ liệu. Hầu hết các nhật ký đều bị bỏ qua trong đầu ra mẫu sau. Nếu bạn không muốn xem mức độ chi tiết này trong thông báo tường trình, bạn có thể thay đổi cấp độ nhật ký trong tệp appsettings.Development.json. Để biết thêm thông tin, hãy xem Đăng nhập .NET Core và ASP.NET Core.

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];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      IF SERVERPROPERTY('EngineEdition') <> 5
      BEGIN
          ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
      END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [__EFMigrationsHistory] (
          [MigrationId] nvarchar(150) NOT NULL,
          [ProductVersion] nvarchar(32) NOT NULL,
          CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
      );

<logs omitted for brevity>

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
      VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
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 bổ sung bảng __EFMigrationsHistory để theo dõi những lần 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 lần migration đầu tiên. (Nhật ký cuối cùng trong ví dụ đầu ra CLI trước đó hiển thị câu lệnh INSERT tạo ra hàng này.)

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

Trang Students Index

 

So sánh CLI và PMC

Công cụ EF để quản lý quá trình migration có sẵn từ các lệnh .NET Core CLI hoặc từ lệnh ghép ngắn PowerShell trong cửa sổ Package Manager Console Visual Studio (PMC). Hướng dẫn này chỉ ra cách sử dụng CLI, nhưng bạn có thể sử dụng PMC nếu muốn.

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 siêu gói Microsoft.AspNetCore.App, 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à gói giống 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 nó 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, hãy xem .NET Core CLI.

Để biết thêm thông tin về các lệnh PMC, hãy xem Bảng điều khiển quản lý gói (Visual Studio).

Lấy mã

Tải xuống hoặc xem ứng dụng đã hoàn thành.

Bước tiếp theo

Chuyển sang hướng dẫn tiếp theo để bắt đầu xem các chủ đề nâng cao hơn về việc mở rộng mô hình dữ liệu. Trong quá trình này, bạn sẽ tạo và áp dụng các lần migration bổ sung.

Tạo và áp dụng các migration bổ sung

Nguồn: learn.microsoft.com
» Tiếp: Tạo mô hình dữ liệu phức tạp
« Trước: Sắp xếp (sorting), lọc (filtering) và phân trang (paging)
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!