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
.
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:
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:
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.
Đ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-migrations
và get-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".