Cơ sở dữ liệu

Trong bài về Model https://hoctructuyencntt.com/2023/02/27/them-mot-model/  chúng ta đã đề cập đến vai trò của EF Core cho phép chúng ta ánh xạ giữa các lớp từ mã chương trình và các bảng trong cơ sở dữ liệu giúp cho việc viết mã truy cập dữ liệu dễ dàng hơn. Cụ thể, trong dự án MVCBooks, lớp MVCBooksContext trong tập tin Data / MVCBooksContext.cs làm nhiệm vụ kết nối cơ sở dữ liệu và ánh xạ các đối tượng (entity) đến các bản ghi (hàng) của cơ sở dữ liệu.

Cũng cần nhắc lại rằng, ASP.NET Core được xây dựng dựa trên Dependency Injection (DI) nên MVCBooksContext phải đăng ký DI trong phương thức ConfigureServices trong tập tin Startup.cs trước khi được sử dụng. Chi tiết về DI sẽ được đề cập chi tiết trong một bài viết khác nhưng có thể tham khảo tại  https://docs.microsoft.com/vi-vn/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1

Chúng ta cũng đã tạo cơ sở dữ liệu dùng Migrations và đây là phiên bản cục bộ LocalDB của SQL Server Express Database Engine. Chuỗi kết nối (Connection String) đối với cơ sở dữ liệu được khai báo với tham số ConnectionStrings trong tập tin appsettings.json. Để xem cơ sở dữ liệu này, có thể vào mục View để mở cửa sổ SQL Server Object Explorer. Trong cửa sổ này tìm đến bảng dbo.Book từ MVCBooksContext:

Nhấn chuột phải vào bảng này chọn View Designer:

Lưu ý, trường Id sẽ được EF tự động chọn làm khóa chính (PK). Nhấn chuột phải vào bảng này chọn View Data:

Đóng tất cả các cửa sổ vừa mở. Thực thi lại ứng dụng và chọn Delete để xóa bản ghi hiện có từ bảng Book.

Bây giờ chúng ta sẽ thêm dữ liệu đến cơ sở dữ liệu dùng mã (Code First).

Nạp dữ liệu

Tạo lớp SeedData trong thư mục Models và thay mã sau:

using Microsoft.EntityFrameworkCore;

using Microsoft.Extensions.DependencyInjection;

using MVCBooks.Data;

using System;

using System.Linq;

namespace MVCBooks.Models

{

    public static class SeedData

    {

        public static void Initialize(IServiceProvider serviceProvider)

        {

            using (var context = new MVCBooksContext(

                serviceProvider.GetRequiredService<

                    DbContextOptions<MVCBooksContext>>()))

            {

                // Kiểm tra thông tin cuốn sách đã tồn tại hay chưa

                if (context.Book.Any())

                {

                    return;   // Không thêm nếu cuốn sách đã tồn tại trong DB

                }

                context.Book.AddRange(

                    new Book

                    {

                        Title = "Atomic Habits",

                        ReleaseDate = DateTime.Parse("2018-10-16"),

                        Genre = "Self-Help",

                        Price = 11.98M

                    },

                    new Book

                    {

                        Title = "Dark Roads",

                        ReleaseDate = DateTime.Parse("2021-8-3"),

                        Genre = "Novel",

                        Price = 18.59M

                    }

                );

                context.SaveChanges();//lưu dữ liệu

            }

        }

    }

}

Tập tin Program.cs được viết lại như sau:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using Microsoft.AspNetCore.Hosting;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.Hosting;

using Microsoft.Extensions.Logging;

using Microsoft.Extensions.DependencyInjection;

using Microsoft.EntityFrameworkCore;

using MVCBooks.Models;

using MVCBooks;

using MVCBooks.Data;

using Microsoft.AspNetCore;

namespace MVCBooks

{

    public class Program

    {

        public static void Main(string[] args)

        {

            var host = CreateWebHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())

            {

                var services = scope.ServiceProvider;

                try

                {

                    var context = services.GetRequiredService<MVCBooksContext>();

                    context.Database.Migrate();

                    SeedData.Initialize(services);

                }

                catch (Exception ex)

                {

                    var logger = services.GetRequiredService<ILogger<Program>>();

                    logger.LogError(ex, " Mot loi xuat hien trong qua trinh nap du lieu.");

                }

            }

            host.Run();

        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

            WebHost.CreateDefaultBuilder(args)

                .UseStartup<Startup>();

    }

} 

Thực thi ứng dụng