Mô hình trong Entity Framework Core

Trong Entity Framework Core, mô hình được chuẩn bị theo yêu cầu của người dùng. Nó phụ thuộc vào số lượng các lớp và danh mục sẽ được nhúng vào cơ sở dữ liệu.

  • Để thực hiện các hoạt động CRUD (Create, Read, Update, Delete) khác nhau trên ứng dụng, mô hình có thể được cấu hình theo cách thủ công và nó có thể được sửa đổi thêm để phù hợp với cơ sở dữ liệu được yêu cầu.
  • Tạo một mô hình trong Entity Framework Core đã trở nên dễ dàng đối với các nhà phát triển.
  • Để thiết kế một mô hình, nó có thể được thực hiện bằng cách viết code theo cách thủ công hoặc bằng cách sử dụng mô hình cơ sở dữ liệu trước đó và điều chỉnh nó theo yêu cầu.
  • Nhưng với các bản cập nhật mới nhất trong Entity Framework Core, có một chút thay đổi trong cách tiếp cận để tạo mô hình từ cơ sở dữ liệu hiện có.
  • Trước đây, các nhà phát triển đã sử dụng cách tiếp cận Database-First nhưng bây giờ trong Entity Framework Core, cách tiếp cận Code-First được sử dụng để tạo mô hình bằng cách sử dụng cơ sở dữ liệu hiện có.

Tạo mô hình bằng cách sử dụng Code-First và cơ sở dữ liệu hiện có

Giao diện dòng lệnh

Để tạo mô hình bằng cơ sở dữ liệu hiện có, nhà phát triển có thể sử dụng các công cụ Giao diện dòng lệnh (CLI), công cụ này giúp tạo các câu lệnh SQL cho mô hình dựa trên cơ sở dữ liệu hiện có.

Sử dụng công cụ CLI, các nhà phát triển có thể tạo cũng như áp dụng di chuyển và tạo mã cho mô hình dựa trên cơ sở dữ liệu mô hình hiện có. Một ưu điểm khác của việc sử dụng cách tiếp cận CLI là các lệnh được tạo bằng cách sử dụng CLI này cũng có thể được sử dụng cho các dự án .NET Core.

Trước khi bắt đầu, đừng quên tạo một thư mục:

mkdir EFCoreExample

Sau khi thư mục được tạo, hãy di chuyển đến thư mục này:

cd EFCoreExample

Bây giờ, hãy tạo một dự án .NET Core Console

dotnet new console

Sau khi thực hiện tất cả những điều này, hãy thêm các công cụ và các gói của Entity Framework Core, nếu bạn chưa có.

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design

Trong hai gói trên, gói đầu tiên là nhà cung cấp Entity Framework Core cho SQL Server,

Gói thứ hai có các lệnh Entity Framework Core, nếu không có các gói này, không thể thực thi các câu lệnh SQL Server,

Bạn sử dụng lệnh dbcontext scaffold để tạo mô hình. Lệnh có hai đối số bắt buộc - chuỗi kết nối và trình cung cấp.

dotnet ef dbcontext scaffold "Server=.\;Database=DemoEFCore;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Model

Lớp DbContext sẽ lấy tên của cơ sở dữ liệu kết hợp với context. Bạn có thể ghi đè này bằng tùy chọn -c hoặc --context. Ví dụ:

dotnet ef dbcontext scaffold "Server=.\;Database=DemoEFCore;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Model -c "EFCoreContext"

Cấu hình mô hình

dotnet ef dbcontext scaffold "Server=.\;Database=DemoEFCore;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -d

Cập nhật mô hình

dotnet ef dbcontext scaffold "Server=.\;Database=DemoEFCore;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -force

Visual Studio

Một cách tiếp cận tuyệt vời khác để tạo mô hình bằng cách sử dụng cơ sở dữ liệu hiện có là thông qua Visual Studio.

  • Trong Visual Studio, nhà phát triển có thể sử dụng Package Manager Console (PMC) để tạo mô hình cần thiết bằng cơ sở dữ liệu hiện có.
  • Sử dụng PMC, người dùng có thể tạo di chuyển, áp dụng di chuyển và tạo mã liên quan cho mô hình dựa trên mô hình hiện có.
  • Để giữ cho những thay đổi mới trong cơ sở dữ liệu đồng bộ với mô hình đã tạo trong Entity Framework Core, chúng tôi sử dụng chuyển đổi.
  • Với chuyển đổi, các thay đổi sẽ được cập nhật trong mô hình và ứng dụng sẽ đồng bộ với mô hình, dẫn đến hiệu suất tốt hơn.
PM> Scaffold-DbContext "Server=.\;Database=DemoEFCore;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Model -Context "EFCoreContext" -DataAnnotations

Thuộc tính shadow để tạo mô hình trong Entity Framework Core

Thuộc tính shadow được giới thiệu khi phát hành Entity Framework Core, chúng không có trong lớp thực thể .NET mà nằm hoặc được định nghĩa trong kiểu thực thể của mô hình Entity Framework Core.

  • Thuộc tính shadow phụ thuộc vào công cụ theo dõi thay đổi (Change Tracker) vì giá trị và trạng thái của chúng có thể được duy trì hoàn toàn bằng công cụ theo dõi thay đổi.
  • Vì vậy, bất cứ khi nào người dùng muốn thay đổi hoặc cần các giá trị của thuộc tính shadow, họ sẽ sử dụng Change Tracker API.
  • Để cấu hình các thuộc tính shadow, các nhà phát triển có thể sử dụng Fluent API cho phép họ tinh chỉnh các giá trị và trạng thái của chúng.
  • Hầu hết những nơi mà các thuộc tính shadow được ưu tiên là sử dụng các thuộc tính khóa ngoại, để thể hiện mối quan hệ giữa hai thực thể trong Cơ sở dữ liệu.
  • Để biểu diễn thuộc tính shadow vào cơ sở dữ liệu trong mối quan hệ giữa hai thực thể khi không tìm thấy khóa ngoại, Entity Frame Core sẽ sử dụng phương thức Quy ước.

Ví dụ dưới đây cho thấy thuộc tính shadow LastUpdated đã được cấu hình trên thực thể Account:

public class SampleContext : DbContext
{
    public DbSet<Account> Accounts{ get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Account>()
            .Property<DateTime>("LastUpdated");
    }
}

public class Account
{
    public int AccountId { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public string EmailId { get; set; }
}

Bây giờ, đoạn mã dưới đây hiển thị một thuộc tính shadow Version được thêm vào thực thể Actor trong phương thức OnModelCreating và sau đó nó được cấu hình để trở thành một phần trong quản lý concurrency:

public class SampleContext : DbContext
{
    public DbSet<Actor> Actors { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Actor>()
            .Property<byte[]>("Version")
            .IsRowVersion();
    }
}

public class Actor
{
    public int ActorId { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public ICollection<Movie> Movies{ get; set; }
}

Thiết lập giá trị của thuộc tính shadow

Để truy cập thuộc tính shadow, bạn có thể sử dụng thuộc tính DbContext.Entry và sau đó thiết lập giá trị thông qua thuộc tính CurrentValue:

var context = new SampleContext();

var account = new Account
{ 
    FName = "John", 
    LName = "Cena" 
};

context.Add(account);
context.Entry(account).Property("LastUpdated").CurrentValue = DateTime.UtcNow;

context.SaveChanges();

Một cách khác để thiết lập giá trị cho các thuộc tính shadow là bằng phương thức Entries() của Change Tracker API. Phương thức này sẽ cập nhật giá trị của LastUpdated bằng cách ghi đè phương thức SaveChanges:

public class SampleContext: DbContext
{
    protected override void OnModelBuilding(ModelBuider modelBuilder)
    {
        modelBuilder.Entity<Account>()
            .Property<DateTime>("LastUpdated");
    }

    public override int SaveChanges()
    {
        ChangeTracker.DetectChanges();
        foreach (var enty in ChangeTracker.Entries())
        {
            if(enty.State == EntityState.Added 
                || enty.State == EntityState.Modified)
            {
                enty.Property("LastUpdated").CurrentValue = DateTime.UtcNow;
            }
        }

        return base.SaveChanges();
    }

    public DbSet<Account> Accounts{ get; set; }
}

public class Account
{
    public int AccountId { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public string EmailID { get; set; }
}

Truy vấn với thuộc tính shadow

Các thuộc tính shadow có thể được liên kết với các truy vấn LINQ bằng phương thức Property tĩnh trong lớp tiện ích EF:

var accounts = context.Accounts
    .OrderBy(account=> EF.Property<DateTime>(account, "LastUpdated"));

Bạn có thể sử dụng chỉ thị static trong C# 6:

using static Microsoft.EntityFrameworkCore.EF;
using static System.Console;
//...

var accounts = context.Accounts
    .OrderBy(account=> Property<DateTime>(account, "LastUpdated"));
Entity Framework Core
Bài Viết Liên Quan:
Bộ chuyển đổi giá trị của Entity Framework Core 5
Trung Nguyen 12/11/2021
Bộ chuyển đổi giá trị của Entity Framework Core 5

Bài viết này sẽ giúp bạn tìm hiểu về bộ chuyển đổi giá trị - một trong những cải tiến mạnh mẽ của Entity Framework Core 5.

Truy vấn SQL thô với Entity Framework Core 5
Trung Nguyen 11/11/2021
Truy vấn SQL thô với Entity Framework Core 5

Trong bài viết này, chúng ta sẽ khám phá cách làm việc với các tính năng của Entity Framework Core 5 (EF Core) để thực thi truy vấn SQL thô.

Cách thêm view vào DbContext trong Entity Framework Core
Trung Nguyen 07/11/2021
Cách thêm view vào DbContext trong Entity Framework Core

Với EF Core 5, chúng ta có thể thêm view vào trong DbContext và tạo view trong database bằng cách sử dụng cơ chế chuyển đổi cơ sở dữ liệu tích hợp sẵn.

Mô hình hóa các mối quan hệ SQL trong EF Core
Trung Nguyen 03/11/2021
Mô hình hóa các mối quan hệ SQL trong EF Core

Bài viết này sẽ khám phá các mối quan hệ trong cơ sở dữ liệu quan hệ và cách mô hình hóa các mối quan hệ đó bằng cách tiếp cận Code First trong EF Core.