EF Code-First - Migration tự động

Migration tự động trong Entity Framework

Entity Framework đã giới thiệu Migration tự động để bạn không phải xử lý di chuyển cơ sở dữ liệu theo cách thủ công cho mỗi thay đổi bạn thực hiện trong các lớp thực thể của mình.

Việc Migration tự động có thể được thực hiện bằng cách thực hiện lệnh enable-migrations trong Package Manager Console.

Mở Package Manager Console bằng cách truy cập menu Tools → Library Package Manager → Package Manager Console và sau đó chạy lệnh enable-migrations –EnableAutomaticMigration:$true.

Lưu ý: bạn phải chọn project chứa lớp Context của bạn khi chạy lệnh trên.

Khi lệnh chạy thành công, nó sẽ tạo một lớp Configuration có nguồn gốc từ lớp DbMigrationConfiguration trong thư mục Migration trong dự án của bạn:

automated migration in code first

Như bạn có thể thấy trong phương thức khởi tạo của lớp Configuration, thuộc tính AutomaticMigrationsEnabled được thiết lập thành true.

Bước tiếp theo là thiết lập trình khởi tạo cơ sở dữ liệu trong lớp Context thành MigrateDatabaseToLatestVersion, 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)
    {
        base.OnModelCreating(modelBuilder);
    }
}

Như vậy là bạn đã thiết lập xong cho migration tự động. EF sẽ tự động đảm nhiệm việc di chuyển khi bạn thay đổi các lớp thực thể.

Đến lúc này, chúng tôi chỉ có lớp thực thể Student trong lớp SchoolContext ở trên. Chạy ứng dụng và xem cơ sở dữ liệu đã được tạo như hình sau:

automated migration in code first

Bạn sẽ thấy rằng EF API đã tạo một bảng hệ thống __MigrationHistory cùng với bảng Students. Bảng __MigrationHistory chứa lịch sử thay đổi cơ sở dữ liệu cho tất cả những lần di chuyển.

Bây giờ, bạn có thể thêm các lớp thực thể mới và khi bạn chạy lại ứng dụng bạn sẽ thấy rằng cơ sở dữ liệu có các bảng cho tất cả các thực thể. Bạn không cần phải chạy bất kỳ lệnh nào.

Tuy nhiên, điều này chỉ hoạt động nếu bạn thêm các lớp thực thể mới hoặc xóa các lớp thực thể. Nó sẽ không hoạt động khi bạn thêm, sửa đổi hoặc xóa các thuộc tính trong các lớp thực thể.

Để kiểm tra điều này, bạn thử xóa bất kỳ thuộc tính nào khỏi lớp thực thể và chạy ứng dụng. Bạn sẽ nhận được ngoại lệ sau đây.

automated migration in code first

Điều này là do bạn sẽ mất dữ liệu trong cột tương ứng của thuộc tính trong lớp thực thể. Vì vậy, để xử lý loại kịch bản này, bạn phải thiết lập giá trị của thuộc tính AutomaticMigrationDataLossAllowed thành true trong phương thức khởi tạo của lớp Configuration, cùng với AutomaticMigrationsEnabled = true;.

Để biết thêm về các tham số của lệnh enable-migrations, bạn có thể chạy lệnh get-help enable-migrationsget-help enable-migrations -detailed trong Package Manager Console, như ví dụ bên dưới.

PM> get-help enable-migrations

NAME
    Enable-Migrations
    
SYNOPSIS
    Enables Code First Migrations in a project.
    
    
SYNTAX
    Enable-Migrations [-ContextTypeName <String>] [-EnableAutomaticMigrations] 
    [-MigrationsDirectory <String>] [-ProjectName <String>] [-StartUpProjectName 
    <String>] [-ContextProjectName <String>] [-ConnectionStringName <String>] 
    [-Force] [-ContextAssemblyName <String>] [-AppDomainBaseDirectory <String>] 
    [<CommonParameters>]
    
    Enable-Migrations [-ContextTypeName <String>] [-EnableAutomaticMigrations] 
    [-MigrationsDirectory <String>] [-ProjectName <String>] [-StartUpProjectName 
    <String>] [-ContextProjectName <String>] -ConnectionString <String> 
    -ConnectionProviderName <String> [-Force] [-ContextAssemblyName <String>] 
    [-AppDomainBaseDirectory <String>] [<CommonParameters>]
    
    
DESCRIPTION
    Enables Migrations by scaffolding a migrations configuration class in the project. If the
    target database was created by an initializer, an initial migration will be created (unless
    automatic migrations are enabled via the EnableAutomaticMigrations parameter).
    

RELATED LINKS

REMARKS
    To see the examples, type: "get-help Enable-Migrations -examples".
    For more information, type: "get-help Enable-Migrations -detailed".
    For technical information, type: "get-help Enable-Migrations -full".