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.
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.
- <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 - <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.
- <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.
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ề