Có nên dùng migration data asp.net core

(netcore.vn) - Sau đây, .NET Core VN xin giới thiệu về chạy migration cho Identity trong ASP.NET Core.Trong chương này, chúng tôi sẽ thảo luận về việc di chuyển Danh tính. Trong ASP.NET Core MVC, các tính năng xác thực và nhận dạng được cấu hình trong tệp Startup.cs.

public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddEntityFramework() .AddSqlServer() .AddDbContextoption. UseSqlServer(Configuration["database:connection"])); services.AddIdentity() .AddEntityFrameworkStores(); }

Bất cứ khi nào bạn thực hiện thay đổi đối với một trong các lớp thực thể hoặc bạn thực hiện thay đổi đối với lớp dẫn xuất DBContext của mình, rất có thể bạn sẽ phải tạo một tập lệnh di chuyển mới để áp dụng vào cơ sở dữ liệu và đưa lược đồ đồng bộ với mã trong mã của bạn .

Đây là trường hợp trong ứng dụng của chúng tôi bởi vì bây giờ chúng tôi lấy được lớp FirstAppDemoDbContext của chúng tôi từ lớp IdentityDbContext và nó chứa DbSets của riêng nó và nó cũng sẽ tạo một lược đồ để lưu trữ tất cả thông tin về các thực thể mà nó quản lý.

using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Data.Entity; namespace FirstAppDemo.Models { public class FirstAppDemoDbContext : IdentityDbContext { public DbSet Employees { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Data Source = (localdb)\\MSSQLLocalDB; Initial Catalog = FirstAppDemo;Integrated Security = True; Connect Timeout = 30;Encrypt = False; TrustServerCertificate = True;ApplicationIntent = ReadWrite; MultiSubnetFailover = False"); } } }

Bây giờ chúng ta hãy mở dấu nhắc lệnh và đảm bảo rằng chúng ta đang ở vị trí có tệp project.json cho dự án của chúng ta.

Dấu nhắc lệnh
Chúng ta cũng có thể nhận được các lệnh Entity Framework bằng cách gõ dnx ef.

Ex
Tệp project.json của chúng tôi có một phần ánh xạ từ khóa này của efex với EntityFramework.Commands.

"lệnh": {
   "web": "Microsoft.AspNet.Server.Kestrel",
   "ef": "EntityFramework.Commands"
}
Chúng ta có thể thêm một di chuyển từ đây. Chúng tôi cũng cần cung cấp một tên để di chuyển. Hãy để chúng tôi sử dụng v2 cho phiên bản 2 và nhấn enter.

V2 cho phiên bản
Khi quá trình di chuyển hoàn tất, bạn sẽ có tệp v2 trong thư mục di chuyển của mình.

Tập tin V2
Bây giờ chúng tôi muốn áp dụng việc di chuyển đó vào cơ sở dữ liệu của mình bằng cách chạy lệnh cập nhật cơ sở dữ liệu của dnx ef.

Cập nhật cơ sở dữ liệu
Entity Framework sẽ thấy có một di chuyển cần được áp dụng và nó sẽ thực hiện di chuyển đó.

Nếu bạn vào SQL Server Object Explorer, bạn sẽ thấy bảng Nhân viên mà chúng ta đã tạo trước đó. Bạn cũng sẽ thấy một số bảng bổ sung phải lưu trữ người dùng, khiếu nại, vai trò và một số bảng ánh xạ ánh xạ người dùng đến các vai trò cụ thể.

Ở phần trước chúng ta đã cùng nhau xây dựng ứng dụng nhưng chúng đang sử dụng một danh sách công việc giả mạo được viết cứng trong code, ở phần này chúng ta sẽ kết nối chúng với một cơ sở dữ liệu để mọi thứ trở nên hoàn hảo hơn.

Viết mã cơ sở dữ liệu có thể là khó khăn. Trừ khi bạn thực sự biết những gì bạn đang làm, nếu không bạn nên sử dụng các chuỗi truy vấn thô vào ứng dụng của mình. Trình ánh xạ đối tượng quan hệ (ORM) giúp bạn viết mã tương tác với cơ sở dữ liệu dễ dàng hơn bằng cách thêm một lớp trừu tượng giữa mã của bạn với chính cơ sở dữ liệu. Hibernate trong Java và ActiveRecord trong Ruby là hai ORM nổi tiếng.

Có một số ORM cho .NET, một trong số đó được xây dựng bởi Microsoft và được tích hợp sẵn trong Asp.Net Core là Entity FrameWork Core. Entity FrameWork Core giúp dễ dàng kết nối với một số loại cơ sở dữ liệu khác nhau và cho phép bạn sử dụng câu lệnh C# để tạo truy vấn cơ sở dữ liệu và ánh xạ trở lại các model trong C#.

Entity FrameWork Core có thể kết nối tới các cơ sở dữ liệu quan hệ như SQL Server, PostgreSQL, MySQL và cơ sở dữ liệu NOSQL như Mongo. Ở trong những bài tiếp theo chúng ta sẽ sử dụng SQLite để giúp mọi thứ dẽ dàng thiết lập.

Kết nối tới một cơ sở dữ liệu:

Có nên dùng migration data asp.net core

Có một số thứ bạn cần để kết nối Entity FrameWork Core tới cơ sở dữ liệu. Ngay khi bạn chạy câu lệnh dotnet new và mô hình MVC + Individual Auth để cài đặt dự án của bạn thì mọi thứ đã được tích hợp sẵn:

  • The Entity Framework Core packages: Chúng được bao gồm mặc định trong Asp.Net core.
  • A database: Tệp app.db trong thư mục gốc của một dự án là một cơ sở dữ liệu SQLite nhỏ được tạo cho bạn bởi dotnet new. SQLite là một công cụ cơ sở dữ liệu nhẹ, có thể chạy mà không yêu cầu bạn cài đặt bất kỳ công cụ bổ sung nào trên máy của bạn, vì vậy thật hợp lý khi sử dụng chúng ở đây.

Có nên dùng migration data asp.net core

  • A database context class: Database context là một lớp C# cung cấp một điểm vào của cơ sở dữ liệu. Đó là cách mã của bạn sẽ tương tác với một cơ sở dữ liệu để đọc và lưu các mục. Một lớp context cơ bản đã tồn tại trong tệp Data/ApplicationDBContext.cs
  • A connection string: Cho dù bạn kết nối với cơ sở dữ liệu cụ bộ (như SQLite) hay cơ sở dữ liệu được lưu trữ ở một địa điểm khác, bạn sẽ cần định nghĩa một chuỗi chứa tên hoặc địa chỉ cơ sở dữ liệu để kết nối. Chúng đã được thiết lập cho bạn trong tệp appsettings.json. Chuỗi kết nối cho cơ sở dữ liệu SQLite là DataSource=app.db.

Entity Framework Core sử dụng database context và chuỗi kết nối cơ sở dữ liệu để kết nối tới databse. Bạn cần cho Entity Framework core biết context, chuỗi kết nối, nơi cung cấp dữ liệu trong phương thức configureServices của lớp Startup:

services.AddDbContext(options =>
options.UseSqlite(
Configuration.GetConnectionString(“DefaultConnection”)));

Đoạn mã trên thêm ApplicationDbContext vào phân vùng Service và nói cho Entity Framework Core để sử dụng cơ sở dữ liệu SQLite và chuỗi kết nối được cấu hình trong file appsettings.json.

Như bạn có thể thấy, dotnet new tạo ra rất nhiều thứ cho bạn, cơ sở dữ liệu được thiết lập để sẵn sàng sử dụng.Tuy nhiên, nó không có bất kỳ bảng nào để lưu trữ các công việc, bạn cần cập nhật context và di thay đổi cơ sở dữ liệu.

Cập nhật Context:

Thêm một thuộc tính DbSet tới ApplicationDbcontext, bên dưới hàm khởi tạo:

public DbSetItems { get; set; }

Một DbSet mô tả một bảng, với việc khởi tạo một thuộc tính DbSet, bạn đang nói với Entity Framework Core rằng bạn muốn lưu trữ các thực thể TodoItem trong một bảng có tên và Items.

Bạn đã cập nhật lớp context, nhưng bây giờ có một vấn đề nhỏ: Context và cơ sở dữ liệu hiện không đồng bộ, vì thực tế không có bảng Items trong cơ sở dữ liệu. Để cập nhật những thay đổi bạn cần tạo một migration.

Khởi tạo một Migration:

Migration theo dõi các thay đổi đối với cơ sở dữ liệu theo thời gian.Chúng có thể hoàn tác lại một tập các thay đổi, hoặc tạo cơ sở dữ liệu thứ hai có cùng cấu trúc như lần đầu tiên. Với các Migration, bạn có một lịch sử sửa đổi đầy đủ như thêm sửa xóa các cột hoặc toàn bộ bảng.

Trong bài trước bạn đã thêm một Items được đặt vào context. Vì bối cảnh hiện tại bao gồm một tập hợp không tồn tại trong cơ sở dữ liệu, bạn cần tạo một migration để cập nhật cơ sở dữ liệu:

dotnet ef migrations add AddItems

Điều này tạo ra một migration mới gọi là AddItem. Nếu bạn mở thư mục Data/migrations bạn sẽ thấy một vài tệp:

Tệp Migration mới của bạn có tiền tố với dấu thời gian khi bạn tạo nó. Nếu bạn mở tệp migration của bạn, bạn sẽ nhìn thấy các phương thức Up, Down:

Data/Migrations/_AddItems.cs
protected override void Up(MigrationBuilder migrationBuilder)
{
        // (… some code)

       migrationBuilder.CreateTable(
             name: “Items”,
             columns: table => new
             {
                    Id = table.Column(nullable: false),
                    DueAt = table.Column(nullable: true),
                    IsDone = table.Column(nullable: false),
                    Title = table.Column(nullable: true)
            },
            constraints: table =>
            {
                  table.PrimaryKey(“PK_Items”, x => x.Id);
            });

        // (some code…)
}

protected override void Down(MigrationBuilder migrationBuilder)
{
         // (… some code)

        migrationBuilder.DropTable(
               name: “Items”);

       // (some code…)
}

Phương thức up chạy khi bạn áp dụng migration vào database. Vì bạn đã thêm Dbsetvào database context, Entity FrameWork Core sẽ tạo bảng Items khi bạn áp dụng migration.Phương thức Down thực hiện ngược lại: nếu bạn cần hoàn tác, bảng Items sẽ được xóa bỏ.

Giải pháp cho các hạn chế SQLite:

Có một số hạn chế của SQLite gây cản trở nếu bạn cố gắng chạy migration nguyên bản. Cho tới khi điều này được khắc phục, hãy giải quyết bằng cách:

Xóa dòng migrationBuilder.AddForeignKey trong phương thức up và dòng migrationBuilder.DropForeignKey trong phương thức down. Nếu bạn sử dụng cơ sở dữ liệu SQL chính thức như SQL Server hoặc MySQL, bạn sẽ không cần phải làm điều này.

Áp dụng migration:

Bước cuối cùng sau khi khởi tạo một migration là thực sự áp dụng nó vào cơ sở dữ liệu:
dotnet ef database update

Câu lệnh sẽ báo cho Entity FrameWork Core tạo bảng Items trong cơ sở dữ liệu.

Mọi thứ gần như đã hoàn thành, trong bài tiếp theo chúng ta sẽ đi khởi tạo một lớp dịch vụ mới cho cơ sở dữ liệu của chúng ta.