EF Core - Giới thiệu migration

Migration trong Entity Framework Core

Migration là kỹ thuật trong việc tương tác với cơ sở dữ liệu, theo đó việc thay đổi về cấu trúc CSDL ở code sẽ được cập nhật lên CSDL đảm bảo dữ liệu đang tồn tại không bị mất, lịch sử (phiên bản) cập nhật được lưu lại sau mỗi lần cập nhật.

Thường khi sử dụng EF làm việc với DB, có hai cách đó là làm việc với một CSDL đang tồn tại (gọi là database first) - việc cập nhật database thực hiện khá độc lập với ứng dụng - tình huống này Migration ít hữu ích, tuy nhiên trường hợp bạn tạo database từ code, thay đổi cấu trúc database ... bằng code thì migration rất hữu ích. Tất nhiên ta vẫn có cách để sử dụng EF Migration trên database đã tồn tại.

EF Core Migration

Với migration khi bạn cập nhật Model, yêu cầu database cập nhật thì nó sẽ lưu thông tin phiên bản hiện tại của cấu trúc Model (database) ở Server DB - ví dụ phiên bản a, sau đó thay đổi các Model, lại yêu cầu cập nhật thì nó sẽ đọc thông tin phiên bản cuối trên DB, so sánh sự khác biệt và cập nhật sự khác biệt đó để lên phiên bản mới, phiên bản b.

EF Core Migration dùng các lệnh để thực thi trong gói  NuGet Package Manager Console hoặc có thể sử dụng dotnet Command Line Interface (CLI).

Dưới đây là danh sách các Migration quan trọng trong EF Core

Lệnh PMC  Lệnh  dotnet CLI  Cách sử dụng
add-migration <migration name> Add <migration name> Sẽ tạo ra một lớp thực hiện việc chuyển đổi dữ liệu tương thích với sự thay đổi model của bạn ngay bên trong dự án. .
Remove-migration Remove Xóa migration mới nhất.
Update-database Update sẽ cập nhật CSDL để CSDL có các bảng tương ứng với sự thay đổi của các Model
Script-migration Script  Tạo SQL Script cho Migration.

 


 

Tạo một Migration

Trước tiên, Chúng ta phải định nghĩa  các lớp miền ban đầu. Tại thời điểm này, không có cơ sở dữ liệu nào cho ứng dụng của chúng ta có thể lưu trữ dữ liệu từ các lớp miền. Vì vậy, trước tiên, chúng ta cần tạo một migration.

Mở  Package Manager Console từ Tools -> NuGet Package Manager -> Package Manager Console.

Package Manager Console

PM> add-migration MyFirstMigration

Nếu sử dụng lệnh dotnet Command Line Interface.

CLI

> dotnet ef migrations add MyFirstMigration

Sau lệnh này, nó tạo ra 3 file trong thư mục Migrations các file có tên dạng:

Số 20171217070655 sinh ra theo thời điểm chạy lệnh. 3 file này chứa thông tin để có thể cập nhật (hoặc tạo) database đúng cấu trúc Model ở thời điểm mà bạ tạo Migration.

  1. <timestamp>_<Migration Name>.cs:một Migration có một lớp kế thừa từ lớp Migration được tạo ra, trong nó có hai phương thức là Up và Down - để thực hiện chuyển từ phiên bản thấp đến phiên bản này (Up) hoặc đang từ phiên bản này lùi về phiên bản trước (Down). Lớp này được định nghĩa trong 2 file mã nguồn còn lại
  2. <timestamp>_<Migration Name>.Designer.cs: Tệp siêu dữ liệu của migration chứa thông tin được EF Core sử dụng.
  3. <contextclassname>ModelSnapshot.cs:  Là một ảnh chụp model hiện hành. Được sử dụng để quyết định những gì đã thay đổi khi tạo lần migration tiếp theo.

Bây giờ, sau khi tạo migration snapshot, đã đến lúc tạo cơ sở dữ liệu.

Tạo hoặc Cập nhật cơ sở dữ liệu

Sử dụng lệnh sau để tạo hoặc cập nhật lược đồ cơ sở dữ liệu.

Package Manager Console

PM> Update-Database

CLI

> dotnet ef database update

Lệnh Cập nhật sẽ tạo cơ sở dữ liệu dựa trên ngữ cảnh và các lớp miền và migration snapshot, được tạo bằng cách sử dụng lệnh add-migration.

Nếu đây là lần migration đầu tiên, thì nó cũng sẽ tạo ra một bảng có tên __EFMigrationsHistory, bảng này sẽ lưu trữ tên của tất cả các lần migration cũng như thời điểm chúng sẽ được áp dụng cho cơ sở dữ liệu.


Xóa một Migration

Chúng ta có thể xóa migration mới nhất nếu không được thêm vào cơ sở dữ liệu. Sử dụng lệnh xóa sau:

Package Manager Console

PM> remove-migration

CLI

> dotnet ef migrations remove

Các lệnh trên sẽ xóa migration mới nhất và trả về nô hình snapshot cho migration kế tiếp. Chú ý: nếu migration tồn tại trong cơ sở dữ liệu nó sẽ ném ra lỗi ngoại lệ.


Quay trở lại một Migration

Suppose you changed your domain class and created the second migration named MySecondMigration using the add-migration command and applied this migration to the database using the Update command. But, for some reason, you want to revert the database to the previous state. In this case, use the update-database <migration name> command to revert the database to the specified previous migration snapshot.

Giả sử bạn đã thay đổi lớp miền của mình và tạo migration  thứ hai có tên MySecondMigration bằng cách sử dụng lệnh add-migration và áp dụng migration này cho cơ sở dữ liệu bằng lệnh Update. Tuy nhiên, vì lý do nào đó, bạn muốn quay trở lại trạng thái ban đầu cho cơ sở dữ liệu. Trong trường hợp này, hãy sử dụng lệnh update-database <migration name> để quay trở về cơ sở dữ liệu về migration snapshot trước đó.

Package Manager Console

PM> Update-database MyFirstMigration

CLI

> dotnet ef database update MyFirstMigration.

Lệnh trên quay trở lại cơ sở dữ liệu ban đầu dựa vào lệnh migration với tên MyFirstMigration và xóa tất cả thay đổi đã thực thi cho lần migration thứ 2 MySecondMigration. Đồng thời cũng xóa MySecondMigration từ bảng __EFMigrationsHistory trong cơ sở dữ liệu.

Chú ý: Thao tác này sẽ không xóa các tệp migration liên quan đến MySecondMigration. Sử dụng các lệnh remove để xóa chúng khỏi dự án.


Tạo Script SQL

Sử dụng lệnh sau để tạo Script SQL

Package Manager Console

PM> script-migration

CLI

> dotnet ef migrations script

Bạn có thể quay về một phiên bản bất kỳ trong danh sách bằng cách thực hiện lệnh dotnet ef database update tên_quay_về