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:
Cấu hình trong Entity Framework Core
Trung Nguyen 03/04/2021
Cấu hình trong Entity Framework Core

Trong hướng dẫn này, bạn sẽ tìm hiểu cách cấu hình sử dụng attribute, Fluent API để ghi đè các quy ước mặc đình trong Entity Framework Core.

Các quy ước trong Entity Framework Core
Trung Nguyen 03/04/2021
Các quy ước trong Entity Framework Core

Bạn sẽ tìm hiểu các quy ước được tính hợp sẵn trong Entity Framework Core để tạo khóa chính, khóa ngoại, bảng, lược đồ, cột, kiểu dữ liệu, index ...

Quản lý mối quan hệ Một - Nhiều trong Entity Framework Core
Trung Nguyen 03/04/2021
Quản lý mối quan hệ Một - Nhiều trong Entity Framework Core

Trong hướng dẫn này, bạn sẽ tìm hiểu cách tạo, sửa đổi và xóa mối quan hệ một - nhiều trong Entity Framework Core.

Giới thiệu về các mối quan hệ trong Entity Framework Core
Trung Nguyen 03/04/2021
Giới thiệu về các mối quan hệ trong Entity Framework Core

Trong hướng dẫn này, bạn sẽ tìm hiều về các mối quan hệ một - nhiều, nhiều - nhiều và một - một trong Entity Framework Core.