ASP.NET Core: Tổng quan về Migration
Trong các dự án trong thế giới thực, các mô hình dữ liệu thay đổi khi các tính năng được triển khai: các thực thể hoặc thuộc tính mới được thêm và xóa và các lược đồ cơ sở dữ liệu cần được thay đổi tương ứng để được đồng bộ hóa với ứng dụng. Tính năng migration trong EF Core cung cấp một cách để cập nhật dần lược đồ cơ sở dữ liệu nhằm giữ cho lược đồ đó đồng bộ với mô hình dữ liệu của ứng dụng trong khi vẫn bảo toàn dữ liệu hiện có trong cơ sở dữ liệu.
Ở cấp độ cao, quá trình migration hoạt động theo cách sau:
- Khi thay đổi mô hình dữ liệu được đưa ra, nhà phát triển sử dụng các công cụ của EF Core để thêm một quá trình migration tương ứng mô tả các bản cập nhật cần thiết để giữ cho lược đồ cơ sở dữ liệu được đồng bộ hóa. EF Core so sánh mô hình hiện tại với ảnh chụp nhanh của mô hình cũ để xác định sự khác biệt và tạo các tệp nguồn migration; các tệp có thể được theo dõi trong kiểm soát nguồn dự án của bạn giống như bất kỳ tệp nguồn nào khác.
- Khi một lần migration mới đã được tạo, nó có thể được áp dụng cho cơ sở dữ liệu theo nhiều cách khác nhau. EF Core ghi lại tất cả các lần migration đã áp dụng trong một bảng lịch sử đặc biệt, cho phép nó biết lần migration nào đã được áp dụng và lần migration nào chưa.
Phần tiếp theo của bài viết này là hướng dẫn từng bước cho người mới bắt đầu sử dụng migration. Tham khảo các bài viết khác trong phần này để có thêm thông tin chi tiết.
Bắt đầu
Giả sử bạn vừa hoàn thành ứng dụng EF Core đầu tiên của mình, ứng dụng này chứa mô hình đơn giản sau:
public class Blog { public int Id { get; set; } public string Name { get; set; } }
Trong quá trình phát triển, bạn có thể đã sử dụng API Create and Drop để lặp lại nhanh chóng, thay đổi mô hình của mình khi cần; nhưng bây giờ ứng dụng của bạn sẽ được đưa vào sản xuất, bạn cần một cách để phát triển lược đồ một cách an toàn mà không làm mất toàn bộ cơ sở dữ liệu.
Cài đặt các công cụ
Trước tiên, bạn sẽ phải cài đặt các công cụ dòng lệnh của EF Core:
- Bạn nên sử dụng các công cụ .NET Core CLI, nó có thể hoạt động trên tất cả các nền tảng.
- Nếu bạn cảm thấy thoải mái hơn khi làm việc bên trong Visual Studio hoặc có kinh nghiệm với migration EF6, bạn cũng có thể sử dụng công cụ Bảng điều khiển Trình quản lý gói.
Tạo migration đầu tiên của bạn
Bây giờ bạn đã sẵn sàng để thêm migration đầu tiên của mình! Hướng dẫn EF Core nay tạo một migration có tên là InitialCreate:
Với ASP.NET Core:
dotnet ef migrations add InitialCreate
Với Visual Studio:
Add-Migration InitialCreate
EF Core sẽ tạo một thư mục có tên là Migrations trong dự án của bạn và tạo một số tệp. Bạn nên kiểm tra chính xác những gì EF Core đã tạo ra - và có thể sửa đổi nó - nhưng bây giờ chúng ta sẽ bỏ qua phần đó.
Tạo cơ sở dữ liệu và lược đồ của bạn
Tại thời điểm này, bạn có thể yêu cầu EF tạo cơ sở dữ liệu của mình và tạo lược đồ của bạn từ quá trình migration. Điều này có thể được thực hiện thông qua lệnh sau:
Với ASP.NET Core:
dotnet ef database update
Với Visual Studio:
Update-Database
Đó là tất cả những gì cần làm - ứng dụng của bạn đã sẵn sàng để chạy trên cơ sở dữ liệu mới của bạn và bạn không cần phải viết một dòng SQL nào. Lưu ý rằng cách áp dụng migration này lý tưởng cho sự phát triển cục bộ nhưng ít phù hợp hơn với môi trường production - xem trang Áp dụng Migration để biết thêm thông tin.
Phát triển mô hình của bạn
Một vài ngày đã trôi qua và bạn được yêu cầu thêm dấu thời gian tạo vào blog của mình. Bạn đã thực hiện các thay đổi cần thiết cho ứng dụng của mình và mô hình của bạn bây giờ trông như thế này:
public class Blog { public int Id { get; set; } public string Name { get; set; } public DateTime CreatedTimestamp { get; set; } }
Mô hình của bạn và cơ sở dữ liệu production của bạn hiện không đồng bộ - chúng tôi phải thêm một cột mới vào lược đồ cơ sở dữ liệu của bạn. Hãy tạo một migration mới cho việc này:
Với ASP.NET Core:
dotnet ef migrations add AddBlogCreatedTimestamp
Với Visual Studio:
Add-Migration AddBlogCreatedTimestamp
Lưu ý rằng chúng tôi cung cấp cho quá trình migration một tên mô tả để dễ hiểu lịch sử dự án sau này.
Vì đây không phải là lần migration đầu tiên của dự án, EF Core hiện so sánh mô hình được cập nhật của bạn với ảnh chụp nhanh của mô hình cũ, trước khi cột được thêm vào; ảnh chụp nhanh mô hình là một trong những tệp được tạo bởi EF Core khi bạn thêm một lần migration và được kiểm tra trong kiểm soát nguồn. Dựa trên sự so sánh đó, EF Core phát hiện ra rằng một cột đã được thêm vào và thêm phần migration thích hợp.
Bây giờ bạn có thể áp dụng migration của mình như trước đây:
Với ASP.NET Core:
dotnet ef database update
Với Visual Studio:
Update-Database
Lưu ý rằng lần này, EF phát hiện ra rằng cơ sở dữ liệu đã tồn tại. Ngoài ra, khi lần migration đầu tiên của chúng tôi được áp dụng ở trên, thực tế này đã được ghi lại trong bảng lịch sử migration đặc biệt trong cơ sở dữ liệu của bạn; điều này cho phép EF chỉ tự động áp dụng migration mới.
Loại trừ các bộ phận của mô hình của bạn
Đôi khi bạn có thể muốn tham khảo các kiểu từ một DbContext khác. Điều này có thể dẫn đến xung đột migration. Để ngăn chặn điều này, hãy loại trừ loại khỏi quá trình migration của một trong các DbContext.
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<IdentityUser>() .ToTable("AspNetUsers", t => t.ExcludeFromMigrations()); }
Bước tiếp theo
Trên đây chỉ là phần giới thiệu ngắn gọn về migration. Vui lòng tham khảo các trang tài liệu khác để tìm hiểu thêm về quản lý migration, áp dụng chúng và các khía cạnh khác. Tham chiếu công cụ .NET Core CLI cũng chứa thông tin hữu ích về các lệnh khác nhau
Tài nguyên bổ sung
- Tham khảo công cụ Entity Framework Core - .NET Core CLI : Bao gồm các lệnh để cập nhật, loại bỏ, thêm, loại bỏ, v.v.
- Tham khảo công cụ Entity Framework Core - Bảng điều khiển quản lý gói trong Visual Studio : Bao gồm các lệnh để cập nhật, loại bỏ, thêm, loại bỏ, v.v.
- Phiên dự phòng cộng đồng dữ liệu .NET xem qua các tính năng migration mới trong EF Core 5.0.