EF Code-First - Migration dựa trên mã nguồn
Migration dựa trên mã nguồn trong Entity Framework
Trong phần trước, bạn đã tìm hiểu về Migration tự động trong Entity Framework tự động cập nhật lược đồ cơ sở dữ liệu khi bạn thay đổi các lớp thực thể. Ở phần này, bạn sẽ tìm hiểu về Migration dựa trên mã.
Migration dựa trên mã cung cấp thêm quyền kiểm soát đối với việc di chuyển và cho phép bạn cấu hình những thứ bổ sung như thiết lập giá trị mặc định của cột, cấu hình cột được tính toán, v.v.
Để sử dụng Migration dựa trên mã, bạn cần thực hiện các lệnh sau trong Package Manager Console trong Visual Studio:
- Enable-Migrations: Cho phép di chuyển trong dự án của bạn bằng cách tạo một lớp
Configuration
. - Add-Migration: Tạo một lớp di chuyển mới theo tên được chỉ định với các phương thức
Up()
vàDown()
. - Update-Database: Thực thi file di chuyển cuối cùng được tạo bởi lệnh
Add-Migration
và áp dụng các thay đổi cho lược đồ cơ sở dữ liệu.
Để sử dụng Migration dựa trên mã, trước tiên hãy thực thi lệnh enable-migrations
trong Package Manager Console. Mở Package Manager Console từ menu Tools → Library Package Manager → Package Manager Console và sau đó chạy lệnh enable-migrations
(đảm bảo rằng dự án mặc định là dự án có lớp Context của bạn).
Lệnh Enable-Migrations
sẽ tạo ra lớp Configuration
có nguồn gốc từ DbMigrationsConfiguration
với AutomaticMigrationsEnabled = false
.
Bây giờ, bạn cần thiết lập trình khởi tạo cơ sở dữ liệu MigrateDatabaseToLatestVersion
trong lớp Context của mình, như ví dụ bên dưới.
public class SchoolContext: DbContext
{
public SchoolDBContext(): base("SchoolDB")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<SchoolDBContext, EF6Console.Migrations.Configuration>());
}
public DbSet<Student> Students { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
Bây giờ, bạn phải tạo một lớp Migration bằng cách sử dụng lệnh Add-Migration
với tên của lớp Migration của bạn, như được hiển thị bên dưới.
Lệnh trên sẽ tạo một file có tên <timestamp>_SchoolDB-v1.cs
có các phương thức Up()
và Down()
, như hiển thị bên dưới.
Như bạn có thể thấy, phương thức Up()
chứa mã để tạo các đối tượng cơ sở dữ liệu và phương thức Down()
chứa mã để loại bỏ hoặc xóa các đối tượng cơ sở dữ liệu.
Bạn cũng có thể viết mã tùy chỉnh của riêng bạn cho các cấu hình bổ sung. Đây là lợi thế so với Migration tự động.
Để biết thêm về các tham số lệnh add-migration
, thực thi các lệnh get-help add-migration
hoặc get-help add-migration -detailed
trong Package Manager Console, như hiển thị bên dưới.
PM> get-help add-migration
NAME
Add-Migration
SYNOPSIS
Scaffolds a migration script for any pending model changes.
SYNTAX
Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>]
[-ConfigurationTypeName <String>] [-ConnectionStringName <String>] [-IgnoreChanges]
[-AppDomainBaseDirectory <String>] [<CommonParameters>]
Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>]
[-ConfigurationTypeName <String>] -ConnectionString <String> -ConnectionProviderName <String>
[-IgnoreChanges] [-AppDomainBaseDirectory <String>] [<CommonParameters>]
DESCRIPTION
Scaffolds a new migration script and adds it to the project.
RELATED LINKS
REMARKS
To see the examples, type: "get-help Add-Migration -examples".
For more information, type: "get-help Add-Migration -detailed".
For technical information, type: "get-help Add-Migration -full".
Sau khi tạo file Migration bằng lệnh add-migration, bạn phải cập nhật cơ sở dữ liệu.
Thực thi lệnh Update-Database
để tạo hoặc sửa đổi một lược đồ cơ sở dữ liệu. Sử dụng tùy chọn –verbose
để xem các câu lệnh SQL đang được áp dụng cho cơ sở dữ liệu đích.
Thực thi lệnh get-help update-database
hoặc get-help update-database -detailed
trong Package Manager Console để biết thêm về lệnh.
PM> get-help update-database
NAME
Update-Database
SYNOPSIS
Applies any pending migrations to the database.
SYNTAX
Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force]
[-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>]
[-ConnectionStringName <String>] [-AppDomainBaseDirectory <String>] [<CommonParameters>]
Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force]
[-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>]
-ConnectionString <String> -ConnectionProviderName <String> [-AppDomainBaseDirectory <String>]
[<CommonParameters>]
DESCRIPTION
Updates the database to the current model by applying pending migrations.
RELATED LINKS
REMARKS
To see the examples, type: "get-help Update-Database -examples".
For more information, type: "get-help Update-Database -detailed".
For technical information, type: "get-help Update-Database -full".
Tại thời điểm này, cơ sở dữ liệu sẽ được tạo hoặc cập nhật. Bây giờ, bất cứ khi nào bạn thay đổi các lớp thực thể, hãy thực thi lệnh Add-Migration
với tham số name để tạo file Migration mới và sau đó thực hiện lệnh Update-Database
để áp dụng các thay đổi cho lược đồ cơ sở dữ liệu.
Rollback Migration
Giả sử bạn muốn khôi phục lược đồ cơ sở dữ liệu về bất kỳ trạng thái nào trước đó, thì bạn có thể thực thi lệnh update-database
với tham số –TargetMigration
đến điểm mà bạn muốn quay lại.
Ví dụ: giả sử có nhiều lần Migration được áp dụng cho cơ sở dữ liệu SchoolDB ở trên nhưng bạn muốn quay lại lần di chuyển đầu tiên. Thì thực hiện lệnh sau.
PM> update-database -TargetMigration:SchoolDB-v1