Nội dung chính
- 1 Entity Framework Core toàn tập
- 1.1 Lịch sử phiên bản Entity Framework Core
- 1.2 Cách tiếp cận phát triển của EF Core
- 1.3 EF Core với EF 6
- 1.4 Trình cung cấp cơ sở dữ liệu của EF Core
- 1.5 Cài đặt Entity Framework Core
- 1.6 Tạo mô hình từ database có sẵn trong EF Core
- 1.7 DbContext trong Entity Framework Core
- 1.8 Tạo ứng dụng EF Core đầu tiên
- 1.9 Các quy ước trong Entity Framework Core
- 1.10 Cấu hình trong Entity Framework Core
- 1.11 Attribute chú thích dữ liệu trong EF Core
- 1.12 Fluent API trong EF Core
- 1.13 Cấu hình Fluent API trong EF Core
- 1.14 Truy vấn trong Entity Framework Core
- 1.15 Kịch bản lưu dữ liệu trong Entity Framework Core
Entity Framework Core toàn tập
- Trung Nguyen
-
29/04/2020
-
40 min read
Entity Framework Core là phiên bản mới của Entity Framework sau EF 6. x. Nó là mã nguồn mở, nhẹ, hoàn toàn có thể lan rộng ra và là phiên bản đa nền tảng của công nghệ tiên tiến truy vấn tài liệu Entity Framework .
Entity Framework là một framework Object/Relational Mapping (O/RM – ánh xạ quan hệ/đối tượng). Đây là một cải tiến của ADO.NET, cung cấp cho các nhà phát triển một cơ chế tự động để truy cập và lưu trữ dữ liệu trong cơ sở dữ liệu.
Bạn đang đọc: Entity Framework Core toàn tập | Comdy
EF Core được dự tính sẽ sử dụng với những ứng dụng. NET Core. Tuy nhiên, nó cũng hoàn toàn có thể được sử dụng với những ứng dụng dựa trên. NET Framework 4.5 + tiêu chuẩn .Hình dưới đây minh họa những loại ứng dụng được tương hỗ ,. NET Framework và HĐH .
Lịch sử phiên bản Entity Framework Core
Phiên bản EF Core | Ngày phát hành |
---|---|
Entity Framework Core 5.0 | Tháng 11 – 2020 (dự kiến) |
Entity Framework Core 3.1 | Tháng 12 – 2019 |
Entity Framework Core 3.0 | Tháng 9 – 2019 |
Entity Framework Core 2.2 | Tháng 12 – 2018 |
Entity Framework Core 2.1 | Tháng 5 – 2018 |
Entity Framework Core 2.0 | Tháng 8 – 2017 |
Entity Framework Core 1.1 | Tháng 11 – 2016 |
Entity Framework Core 1.0 | Tháng 6 – 2016 |
Mã nguồn Entity Framework Core trên GitHub : https://github.com/aspnet/EntityFrameworkCoreLộ trình tăng trưởng Entity Framework Core : docs.microsoft.com/en-us/ef/core/what-is-new/roadmapTheo dõi những yếu tố của Entity Framework Core tại : https://github.com/aspnet/EntityFrameworkCore/issuesTài liệu chính thức của Entity Framework Core : https://docs.microsoft.com/ef/core
Cách tiếp cận phát triển của EF Core
EF Core tương hỗ hai cách tiếp cận tăng trưởng : Code First và Database First. EF Core đa phần nhắm vào cách tiếp cận Code First và cung ứng ít tương hỗ cho cách tiếp cận Database First vì trình phong cách thiết kế trực quan hoặc trình hướng dẫn cho quy mô DB không được tương hỗ kể từ EF Core 2.0 .Theo cách tiếp cận Code First, EF Core API tạo cơ sở tài liệu và những bảng bằng cách sử dụng quy đổi ( migration ) dựa trên những quy ước và thông số kỹ thuật được phân phối trong những lớp thực thể của bạn. Cách tiếp cận này rất hữu dụng trong phong cách thiết kế hướng miền ( Domain Driven Design – DDD ) .Theo cách tiếp cận Database First, EF Core API tạo những lớp thực thể và Context dựa trên cơ sở tài liệu hiện có của bạn bằng cách sử dụng những lệnh của EF Core. Điều này được tương hỗ hạn chế trong EF Core vì nó không tương hỗ trình phong cách thiết kế trực quan hoặc trình hướng dẫn .
EF Core với EF 6
Entity Framework Core là phiên bản mới và nâng cấp cải tiến của Entity Framework cho những ứng dụng. NET Core. EF Core là phiên bản mới trọn vẹn, vì thế nó vẫn chưa không thiếu như EF 6 .EF Core liên tục tương hỗ những tính năng và khái niệm giống như EF 6 như sau :
- DbContext và Dbset.
- Mô hình dữ liệu.
- Truy vấn bằng cách sử dụng Linq-to-Entities.
- Theo dõi thay đổi.
- SaveChanges.
- Chuyển đổi (Migration).
EF Core từ từ sẽ có hầu hết những tính năng của EF 6. Tuy nhiên, có một số ít tính năng của EF 6 không được tương hỗ trong EF Core 2.0, ví dụ điển hình như :
- EDMX/Graphical Visualization của mô hình.
- Trình hướng dẫn mô hình dữ liệu thực thể (cho phương pháp Database First).
- ObjectContext API.
- Truy vấn bằng cách sử dụng Entity SQL.
- Chuyển đổi tự động.
- Kế thừa: Bảng trên mỗi kiểu (TPT)
- Kế thừa: Bảng trên mỗi lớp con (TPC)
- Mối quan hệ nhiều-nhiều.
- Chia tách thực thể.
- Kiểu dữ liệu không gian.
- Ánh xạ stored procedure với DbContext cho hoạt động CUD (Create, Update, Delete).
- Seed data.
EF Core có những tính năng mới sau đây không được tương hỗ trong EF 6. x :
- Cấu hình mối quan hệ dễ dàng
- Các thao tác INSERT, UPDATE và DELETE hàng loạt.
- Trình cung cấp trong bộ nhớ để thử nghiệm.
- Hỗ trợ cho IoC (Đảo ngược sự phụ thuộc).
- Ràng buộc duy nhất (unique contraints).
- Thuộc tính ẩn (shadow property).
- Khóa thay thế.
- Bộ lọc truy vấn toàn cục.
- Ánh xạ trường.
- DbContext chung
- Các mẫu tốt hơn để xử lý các biểu đồ thực thể bị ngắt kết nối
Tìm hiểu thêm về sự độc lạ của EF Core và EF 6 tại đây .
Trình cung cấp cơ sở dữ liệu của EF Core
Entity Framework Core sử dụng quy mô trình cung ứng để truy vấn nhiều loại cơ sở tài liệu khác nhau. EF Core có những trình phân phối dưới dạng những gói NuGet mà bạn cần setup .Bảng sau liệt kê một số ít trình cung ứng cơ sở tài liệu và những gói NuGet cho EF Core .
Database | NuGet Package |
---|---|
SQL Server | Microsoft.EntityFrameworkCore.SqlServer |
MySQL | MySql.Data.EntityFrameworkCore |
PostgreSQL | Npgsql.EntityFrameworkCore.PostgreSQL |
SQLite | Microsoft.EntityFrameworkCore.SQLite |
SQL Compact | EntityFrameworkCore.SqlServerCompact40 |
In-memory | Microsoft.EntityFrameworkCore.InMemory |
Cài đặt Entity Framework Core
Entity Framework Core hoàn toàn có thể được sử dụng với những ứng dụng dựa trên. NET Core hoặc. NET Framework 4.6. Ở phần này, bạn sẽ khám phá cách setup và sử dụng Entity Framework Core 2.0 trong những ứng dụng. NET Core bằng Visual Studio 2017 .EF Core không phải là một phần của. NET Core và. NET Framework tiêu chuẩn. Nó là một gói NuGet. Bạn cần setup những gói NuGet cho hai thành phần sau đây để sử dụng EF Core trong ứng dụng của bạn :
- Trình cung cấp cơ sở dữ liệu của EF Core.
- Công cụ EF Core.
Cài đặt trình cung cấp cơ sở dữ liệu của EF Core
Như đã đề cập trong phần trước, EF Core được cho phép tất cả chúng ta truy vấn cơ sở tài liệu trải qua quy mô trình cung ứng .Có những trình phân phối cơ sở tài liệu EF Core cho những cơ sở tài liệu khác nhau. Các trình cung ứng này có sẵn dưới dạng những gói NuGet .
Trước tiên, chúng ta cần cài đặt gói NuGet cho trình cung cấp cơ sở dữ liệu mà chúng ta muốn truy cập. Ở đây, chúng tôi muốn truy cập cơ sở dữ liệu MS SQL Server, vì vậy chúng tôi cần cài đặt gói NuGet Microsoft.EntityFrameworkCore.SqlServer
.
Để thiết lập gói NuGet của trình cung ứng DB, bạn nhấp chuột phải vào dự án Bất Động Sản trong Solution Explorer trong Visual Studio và chọn Manage NuGet Packages .. ( hoặc chọn trên menu : Tools -> NuGet Package Manager -> Manage NuGet Packages For Solution ) .
Chọn trình cung cấp cho cơ sở dữ liệu bạn muốn truy cập. Trong trường hợp này, chọn Microsoft.EntityFrameworkCore.SqlServer
cho MS SQL Server như hình trên. (đảm bảo rằng nó có logo .NET và tác giả là Microsoft). Nhấp vào Install để bắt đầu cài đặt.
Cửa sổ xem trước hiển thị list những gói sẽ thiết lập trong ứng dụng của bạn. Xem lại những đổi khác và nhấp vào OK .
Điều này sẽ cài đặt gói Microsoft.EntityFrameworkCore.SqlServer
. Kiểm tra nó trong Dependencies -> NuGet, như hình ảnh bên dưới.
Lưu ý: gói NuGet của trình cung cấp cũng đã cài đặt các gói phụ thuộc khác như
Microsoft.EntityFrameworkCore.Relational
vàSystem.Data.SqlClient
.
Ngoài ra, bạn cũng có thể cài đặt gói NuGet của trình cung cấp bằng Package Manager Console. Chuyển đến Tools -> NuGet Package Manager -> Package Manager Console và thực hiện lệnh sau để cài đặt gói trình cung cấp SQL Server:
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
Cài đặt công cụ của EF Core
Cùng với gói trình phân phối DB, bạn cũng cần setup những công cụ EF để thực thi những lệnh EF Core .Điều này giúp thuận tiện thực thi 1 số ít trách nhiệm tương quan đến EF Core trong dự án Bất Động Sản của bạn tại thời gian phong cách thiết kế, ví dụ điển hình như quy đổi, scaffolding, v.v.Công cụ EF có sẵn dưới dạng những gói NuGet. Bạn hoàn toàn có thể setup gói NuGet cho những công cụ EF tùy thuộc vào nơi bạn muốn thực thi những lệnh : sử dụng Package Manager Console ( phiên bản PowerShell của những lệnh EF Core ) hoặc sử dụng dotnet CLI .
Cài đặt công cụ EF Core cho PMC
Để thực thi các lệnh EF Core từ Package Manager Console, hãy tìm kiếm gói Microsoft.EntityFrameworkCore.Tools
từ NuGet UI và cài đặt nó như hình ảnh bên dưới.
Cài đặt công cụ EF Core cho dotnet CLI
Nếu bạn muốn thực thi các lệnh EF Core từ CLI (Giao diện dòng lệnh) của .NET Core, trước tiên hãy cài đặt gói NuGet Microsoft.EntityFrameworkCore.Tools.DotNet
bằng NuGet UI.
Sau khi cài đặt gói Microsoft.EntityFrameworkCore.Tools.DotNet
, chỉnh sửa file .csproj bằng cách nhấp chuột phải vào dự án trong Solution Explorer và chọn Edit .csproj. Thêm node như ví dụ dưới đây. Đây là một bước bổ sung mà bạn cần thực hiện để thực thi các lệnh EF Core 2.0 từ dotnet CLI trong Visual Studio 2017.
Exe
netcoreapp2.0
Bây giờ, hãy mở dấu nhắc lệnh (hoặc thiết bị đầu cuối như PowerShell chẳng hạn) từ thư mục gốc của dự án của bạn và thực hiện các lệnh EF Core từ CLI bắt đầu bằng lệnh dotnet ef, như hình ảnh bên dưới.
Tạo mô hình từ database có sẵn trong EF Core
Ở phần này bạn sẽ tìm hiểu và khám phá cách tạo lớp Context và những lớp thực thể cho cơ sở tài liệu có sẵn trong Entity Framework Core. Tạo những lớp thực thể và Context cho cơ sở tài liệu có sẵn được gọi là giải pháp tiếp cận Database First .EF Core không tương hỗ trình phong cách thiết kế trực quan cho quy mô DB và trình hướng dẫn để tạo những thực thể và những lớp Context tựa như như EF 6 .
Vì vậy, chúng ta cần thực hiện kỹ thuật đảo ngược bằng cách sử dụng lệnh Scaffold-DbContext
. Lệnh đảo ngược này tạo ra các lớp thực thể và Context (bằng cách kế thừa từ lớp DbContext
) dựa trên lược đồ của cơ sở dữ liệu hiện có.
Chúng ta sẽ tạo những lớp thực thể và Context cho cơ sở tài liệu SchoolDB sau trong MS SQL Server như hình ảnh bên dưới .
Lệnh Scaffold-DbContext
Sử dụng lệnh Scaffold-DbContext
để tạo một mô hình dựa trên cơ sở dữ liệu hiện tại của bạn. Các tham số sau có thể được chỉ định cho Scaffold-DbContext trong Package Manager Console:
Scaffold-DbContext [-Connection] [-Provider] [-OutputDir] [-Context] [-Schemas>] [-Tables>]
[-DataAnnotations] [-Force] [-Project] [-StartupProject] []
Trong Visual Studio, chọn menu Tools -> NuGet Package Manger -> Package Manger Console và chạy lệnh sau :
PM> Scaffold-DbContext "Server=.\SQLExpress;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
Trong lệnh trên, tham số tiên phong là một chuỗi liên kết gồm có ba phần : Máy chủ DB, tên cơ sở tài liệu và thông tin bảo mật thông tin .
Ở đây, Server=.\SQLExpress;
đề cập đến máy chủ cơ sở dữ liệu SQLEXPRESS cục bộ. Database=SchoolDB;
chỉ định tên cơ sở dữ liệu “SchoolDB” mà chúng ta sẽ tạo các lớp. Trusted_Connection=True;
chỉ định xác thực Windows. Nó sẽ sử dụng thông tin đăng nhập Windows để kết nối với SQL Server.
Tham số thứ hai là tên nhà cung cấp. Chúng tôi sử dụng nhà cung cấp cho SQL Server, vì vậy nó là Microsoft.EntityFrameworkCore.SqlServer
.
Tham số -OutputDir
mô tả thư mục nơi mà chúng tôi muốn tạo ra tất cả các lớp thực thể, đó là thư mục Models.
Sử dụng lệnh sau để xem chi tiết về lệnh Scaffold-DbContext
:
PM> get-help scaffold-dbcontext –detailed
Lệnh trên Scaffold-DbContext
tạo các lớp thực thể cho mỗi bảng trong cơ sở dữ liệu SchoolDB
và lớp Context với các cấu hình Fluent API cho tất cả các thực thể trong thư mục Models.
Sau đây là lớp thực thể Student
được tạo cho bảng Student
.
using System;
using System.Collections.Generic;
namespace EFCoreTutorials.Models
{
public partial class Student
{
public Student()
{
StudentCourse = new HashSet();
}
public int StudentId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int? StandardId { get; set; }
public Standard Standard { get; set; }
public StudentAddress StudentAddress { get; set; }
public ICollection StudentCourse { get; set; }
}
}
Sau đây là lớp SchoolDBContext
mà bạn có thể sử dụng để lưu hoặc truy xuất dữ liệu.
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
namespace EFCoreTutorials.Models
{
public partial class SchoolDBContext : DbContext
{
public virtual DbSet Course { get; set; }
public virtual DbSet Standard { get; set; }
public virtual DbSet Student { get; set; }
public virtual DbSet StudentAddress { get; set; }
public virtual DbSet StudentCourse { get; set; }
public virtual DbSet Teacher { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
optionsBuilder.UseSqlServer(@"Server=.\SQLExpress;Database=SchoolDB;Trusted_Connection=True;");
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.Property(e => e.CourseName)
.HasMaxLength(50)
.IsUnicode(false);
entity.HasOne(d => d.Teacher)
.WithMany(p => p.Course)
.HasForeignKey(d => d.TeacherId)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("FK_Course_Teacher");
});
modelBuilder.Entity(entity =>
{
entity.Property(e => e.Description)
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.StandardName)
.HasMaxLength(50)
.IsUnicode(false);
});
modelBuilder.Entity(entity =>
{
entity.Property(e => e.StudentId).HasColumnName("StudentID");
entity.Property(e => e.FirstName)
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.LastName)
.HasMaxLength(50)
.IsUnicode(false);
entity.HasOne(d => d.Standard)
.WithMany(p => p.Student)
.HasForeignKey(d => d.StandardId)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("FK_Student_Standard");
});
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.StudentId);
entity.Property(e => e.StudentId)
.HasColumnName("StudentID")
.ValueGeneratedNever();
entity.Property(e => e.Address1)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.Address2)
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.City)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.State)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false);
entity.HasOne(d => d.Student)
.WithOne(p => p.StudentAddress)
.HasForeignKey(d => d.StudentId)
.HasConstraintName("FK_StudentAddress_Student");
});
modelBuilder.Entity(entity =>
{
entity.HasKey(e => new { e.StudentId, e.CourseId });
entity.HasOne(d => d.Course)
.WithMany(p => p.StudentCourse)
.HasForeignKey(d => d.CourseId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_StudentCourse_Course");
entity.HasOne(d => d.Student)
.WithMany(p => p.StudentCourse)
.HasForeignKey(d => d.StudentId)
.HasConstraintName("FK_StudentCourse_Student");
});
modelBuilder.Entity(entity =>
{
entity.Property(e => e.StandardId).HasDefaultValueSql("((0))");
entity.Property(e => e.TeacherName)
.HasMaxLength(50)
.IsUnicode(false);
entity.HasOne(d => d.Standard)
.WithMany(p => p.Teacher)
.HasForeignKey(d => d.StandardId)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("FK_Teacher_Standard");
});
}
}
}
Lưu ý: EF Core chỉ tạo các lớp thực thể cho các bảng chứ không tạo cho Stored Procedure hoặc View.
DotNet CLI
Nếu bạn sử dụng giao diện dòng lệnh dotnet để thực thi các lệnh EF Core thì hãy mở dấu nhắc lệnh và điều hướng đến thư mục gốc của dự án và thực hiện lệnh dotnet ef dbcontext scaffold
sau:
> dotnet ef dbcontext scaffold "Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models
Như vậy là bạn hoàn toàn có thể tạo quy mô EF Core cho cơ sở tài liệu có sẵn .
Lưu ý: Khi bạn đã tạo mô hình, bạn phải sử dụng các lệnh chuyển đổi (migration) bất cứ lúc nào bạn thay đổi mô hình để giữ cho cơ sở dữ liệu được cập nhật với mô hình.
DbContext trong Entity Framework Core
Lớp DbContext là một phần không thể thiếu của Entity Framework. Một thể hiện của DbContext
đại diện cho một phiên làm việc với cơ sở dữ liệu có thể được sử dụng để truy vấn và lưu các thể hiện của các thực thể của bạn vào cơ sở dữ liệu.
DbContext
là sự kết hợp của các mẫu Unit Of Work và Repository. DbContext
trong EF Core cho phép chúng ta thực hiện các tác vụ sau:
- Quản lý kết nối cơ sở dữ liệu.
- Cấu hình mô hình và mối quan hệ.
- Truy vấn cơ sở dữ liệu.
- Lưu dữ liệu vào cơ sở dữ liệu.
- Cấu hình theo dõi thay đổi.
- Bộ nhớ đệm.
- Quản lý giao dịch.
Để sử dụng DbContext
trong ứng dụng, chúng ta cần tạo lớp kế thừa từ lớp DbContext
, còn được gọi là lớp Context.
Lớp Context này thường bao gồm các thuộc tính Dbset cho mỗi thực thể trong mô hình. Hãy xem ví dụ sau mình họa về lớp Context trong EF Core.
public class SchoolContext : DbContext
{
public SchoolContext()
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
//entities
public DbSet Students { get; set; }
public DbSet Courses { get; set; }
}
Trong ví dụ trên, lớp SchoolContext
có nguồn gốc từ lớp DbContext
và chứa các thuộc tính DbSet
của các lớp thực thể Student
và Course
. Nó cũng ghi đè hai phương thức OnConfiguring
và OnModelCreating
.
Chúng ta phải tạo một thể hiện của SchoolContext
để kết nối với cơ sở dữ liệu và lưu hoặc truy xuất dữ liệu Student
hoặc Course
.
Phương thức OnConfiguring()
cho phép chúng ta lựa chọn và cấu hình nguồn dữ liệu được sử dụng với một Context sử dụng DbContextOptionsBuilder
. Tìm hiểu cách cấu hình một lớp DbContext tại đây .
Phương thức OnModelCreating()
cho phép chúng ta cấu hình mô hình sử dụng ModelBuilder
Fluent API.
Các phương thức của DbContext
Phương thức | Mô tả |
---|---|
Add |
Thêm một thực thể mới vào DbContext với trạng thái Added và bắt đầu theo dõi nó. Dữ liệu thực thể mới này sẽ được chèn vào cơ sở dữ liệu khi gọi SaveChanges().
|
AddAsync | Phương thức không đồng bộ để thêm một thực thể mới vào DbContext với trạng thái Added và bắt đầu theo dõi nó. Dữ liệu thực thể mới này sẽ được chèn vào cơ sở dữ liệu khi gọi SaveChangesAsync().
|
AddRange |
Thêm một tập các thực thể mới vào DbContext với trạng thái Added và bắt đầu theo dõi nó. Dữ liệu các thực thể mới này sẽ được chèn vào cơ sở dữ liệu khi gọi SaveChanges().
|
AddRangeAsync | Phương thức không đồng bộ để thêm tập các thực thể mới vào DbContext với trạng thái Added và bắt đầu theo dõi nó. Dữ liệu thực thể mới này sẽ được chèn vào cơ sở dữ liệu khi gọi SaveChangesAsync(). |
Attach |
Đính kèm một thực thể mới hoặc đã tồn tại vào DbContext với trạng thái Unchanged và bắt đầu theo dõi nó.
|
AttachRange |
Đính kèm một tập các thực thể mới hoặc đã tồn tại vào DbContext với trạng thái Unchanged và bắt đầu theo dõi nó.
|
Entry | Trả về một EntityEntry cho thực thể. Entry cung cấp quyền truy cập để thay đổi thông tin theo dõi và hoạt động cho thực thể.
|
Find | Tìm một thực thể với các giá trị khóa chính đã cho. |
FindAsync | Phương thức không đồng bộ để tìm một thực thể với các giá trị khóa chính đã cho. |
Remove | Thiết lập trạng thái Deleted cho thực thể được chỉ định sẽ xóa dữ liệu khi gọi SaveChanges(). |
RemoveRange | Thiết lập trạng thái Deleted cho một tập các thực thể sẽ xóa dữ liệu trong một lần gọi DB duy nhất khi gọi SaveChanges(). |
SaveChanges | Thực thi lệnh INSERT, UPDATE hoặc DELETE vào cơ sở dữ liệu cho các thực thể với trạng thái Added, Modified hoặc Deleted. |
SaveChangesAsync | Phương thức SaveChanges() không đồng bộ |
Set | Tạo một DbSet được sử dụng để truy vấn và lưu các thể hiện của TEntity. |
Update | Đính kèm thực thể bị ngắt kết nối với trạng thái Modified và bắt đầu theo dõi nó. Dữ liệu sẽ được lưu khi gọi SaveChagnes(). |
UpdateRange | Đính kèm một tập các thực thể bị ngắt kết nối với trạng thái Modified và bắt đầu theo dõi nó. Dữ liệu sẽ được lưu khi gọi SaveChagnes(). |
OnConfiguring | Ghi đè phương thức này để cấu hình cơ sở dữ liệu (và các tùy chọn khác) sẽ được sử dụng cho Context này. Phương thức này được gọi khi mỗi thể hiện của Context được tạo. |
OnModelCreating | Ghi đè phương thức này để cấu hình cho các thực thể trong các thuộc tính DbSet của lớp Context. |
Các thuộc tính của DbContext
Thuộc tính | Mô tả |
---|---|
ChangeTracker | Cung cấp truy cập vào thông tin và hoạt động cho các thể hiện của thực thể mà Context này đang theo dõi. |
Database | Cung cấp truy cập vào thông tin và hoạt động liên quan đến cơ sở dữ liệu cho Context này. |
Model | Trả về siêu dữ liệu của các thực thể, mối quan hệ giữa chúng và cách chúng ánh xạ tới cơ sở dữ liệu. |
Tạo ứng dụng EF Core đầu tiên
Ở hướng dẫn này, bạn sẽ khám phá từng bước cách sử dụng Entity Framework Core theo cách tiếp cận Code First. Để minh họa, chúng tôi sẽ tạo một ứng dụng. NET Core Console bằng Visual Studio 2017 ( hoặc mới hơn ) .Ứng dụng. NET Core Console hoàn toàn có thể được tạo bằng Visual Studio 2017 hoặc Giao diện dòng lệnh ( CLI ) cho. NET Core. Ở đây chúng tôi sẽ sử dụng Visual Studio 2017 .Để tạo ứng dụng. NET Core Console, hãy mở Visual Studio 2017 và chọn trên menu : File -> New -> Project .. Điều này sẽ mở hành lang cửa số bật lên New Project như hình ảnh bên dưới .
Trong cửa sổ New Project, mở rộng Installed -> Visual C# ở khung bên trái và chọn mẫu Console App (.NET Core) trong ngăn giữa.
Nhập tên dự án, vị trí đặt dự án và nhấp vào nút OK để tạo ứng dụng bảng điều khiển, như hình ảnh bên dưới.
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
Tạo mô hình dữ liệu thực thể
Entity Framework cần có một quy mô tài liệu thực thể để tiếp xúc với cơ sở tài liệu. Nó thiết kế xây dựng một quy mô dựa trên những lớp thực thể của bạn bằng cách sử dụng thông số kỹ thuật chú thích tài liệu và Fluent API .Mô hình EF gồm có ba phần : quy mô khái niệm, quy mô tàng trữ và ánh xạ giữa quy mô khái niệm và quy mô tàng trữ .Theo cách tiếp cận Code First, EF thiết kế xây dựng quy mô khái niệm dựa trên những lớp thực thể của bạn, lớp Context và những thông số kỹ thuật .EF Core kiến thiết xây dựng quy mô tàng trữ và ánh xạ dựa trên trình phân phối cơ sở tài liệu bạn sử dụng. Ví dụ, quy mô tàng trữ của SQL Server sẽ khác với DB2 .EF sử dụng quy mô này cho những hoạt động giải trí CRUD ( Create, Read, Update, Delete ) cho cơ sở tài liệu .
Tạo Migration trong EF Core
EF Core có những lệnh quy đổi ( Migration ) khác nhau để tạo hoặc update cơ sở tài liệu dựa trên quy mô .
Tại thời điểm này chưa có cơ sở dữ liệu SchoolDB
. Vì vậy, chúng ta cần tạo cơ sở dữ liệu từ mô hình (thực thể và Context) bằng cách thêm chuyển đổi.
Chúng ta hoàn toàn có thể thực thi lệnh quy đổi bằng cách sử dụng Package Manger Console hoặc dotnet CLI ( giao diện dòng lệnh ) .Trong Visual Studio, mở NuGet Package Manager Console từ Tools -> NuGet Package Manager -> Package Manager Console và nhập lệnh sau :
PM> add-migration CreateSchoolDB
Nếu bạn sử dụng dotnet CLI, hãy nhập lệnh sau .
> dotnet ef migrations add CreateSchoolDB
Xem chi tiết cụ thể hướng dẫn từng bước tạo ứng dụng Entity Framework Core tiên phong tại bài viết này .
Các quy ước trong Entity Framework Core
Các quy ước là những quy tắc mặc định bằng cách sử dụng Entity Framework để thiết kế xây dựng một quy mô dựa trên những lớp thực thể của bạn .
Trong bài viết Ứng dụng EF Core đầu tiên, EF Core API tạo ra một lược đồ cơ sở dữ liệu dựa trên các lớp thực thể và lớp Context, không có bất kỳ cấu hình bổ sung nào vì các lớp thực thể đã tuân theo các quy ước.
Hãy xem những lớp thực thể và lớp Context sau để hiểu những quy ước mặc định .
public class Student
{
public int StudentId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
public byte[] Photo { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; }
public int GradeId { get; set; }
public Grade Grade { get; set; }
}
public class Grade
{
public int Id { get; set; }
public string GradeName { get; set; }
public string Section { get; set; }
public IList Students { get; set; }
}
public class SchoolContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;");
}
public DbSet Students { get; set; }
}
Chúng ta sẽ tìm hiểu và khám phá những quy ước của EF Core và phương pháp EF Core API tạo cơ sở tài liệu cho những thực thể trên .
Lược đồ
Theo mặc định, EF Core sẽ tạo tất cả các đối tượng cơ sở dữ liệu trong lược đồ dbo.
Bảng
EF Core sẽ tạo các bảng cơ sở dữ liệu cho tất cả các thuộc tính DbSet
trong lớp Context có cùng tên với thuộc tính.
Nó cũng sẽ tạo các bảng cho các thực thể không phải là thuộc tính DbSet
nhưng có thể truy cập thông qua các thuộc tính tham chiếu trong các thực thể DbSet
khác.
Đối với ví dụ trên, EF Core sẽ tạo bảng Students
cho thuộc tính DbSet
trong lớp SchoolContext
và bảng Grade
cho thuộc tính Grade
trong lớp thực thể Student
, mặc dù lớp SchoolContext
không có thuộc tính DbSet
.
Cột
Theo mặc định, EF Core sẽ tạo những cột cho toàn bộ những thuộc tính của một lớp thực thể có cùng tên với thuộc tính .Nó sử dụng những thuộc tính tham chiếu và thuộc tính tập hợp trong việc kiến thiết xây dựng mối quan hệ giữa những bảng tương ứng trong cơ sở tài liệu .
Kiểu dữ liệu cột
Kiểu tài liệu cho những cột trong bảng cơ sở tài liệu tùy thuộc vào cách nhà phân phối cơ sở tài liệu ánh xạ kiểu tài liệu C # với kiểu tài liệu của cơ sở tài liệu đã chọn .Bảng sau liệt kê ánh xạ giữa kiểu tài liệu C # sang kiểu tài liệu cột SQL Server .
Kiểu dữ liệu C# | Ánh xạ tới kiểu dữ liệu SQL Server |
---|---|
int | int |
string | nvarchar(Max) |
decimal | decimal(18,2) |
float | real |
byte[] | varbinary(Max) |
datetime | datetime |
bool | bit |
byte | tinyint |
short | smallint |
long | bigint |
double | float |
char | Không có ánh xạ |
sbyte | Không có ánh xạ (ném ra exception) |
object | Không có ánh xạ |
Cột Null
EF Core tạo các cột null cho tất cả các kiểu dữ liệu tham chiếu và các thuộc tính kiểu nguyên thủy nullable, ví dụ: string, Nullable, decimal?.
Cột NotNull
EF Core tạo những cột NotNull trong cơ sở tài liệu cho tổng thể những thuộc tính khóa chính và những thuộc tính kiểu nguyên thủy, ví dụ : int, float, decimal, DateTime, v.v.
Khóa chính
EF Core sẽ tạo cột khóa chính cho thuộc tính có tên Id
hoặc Id
(không phân biệt chữ hoa chữ thường).
Ví dụ, EF Core sẽ tạo một cột khóa chính trong bảng Students
nếu lớp Student
có một thuộc tính có tên id, ID, iD, Id, studentid, StudentId, STUDENTID hoặc sTUdentID.
Khóa ngoại
Theo quy ước khóa ngoại, EF Core API sẽ tạo một cột khóa ngoại cho mỗi thuộc tính điều hướng tham chiếu trong một thực thể với một trong những mẫu đặt tên sau .
Id
Trong ví dụ của chúng tôi (các thực thể Student
và Grade
), EF Core sẽ tạo một cột khóa ngoại GradeId
trong bảng Students
, như được mô tả trong hình dưới đây.
Tên thuộc tính tham chiếu trong thực thể phụ thuộc | Tên thuộc tính khóa ngoại trong thực thể phụ thuộc | Tên thuộc tính khóa chính | Tên cột khóa ngoại trong DB |
---|---|---|---|
Grade | GradeId | GradeId | GradeId |
Grade | – | GradeId | GradeId |
Grade | – | Id | GradeId |
CurrentGrade | CurrentGradeId | GradeId | CurrentGradeId |
CurrentGrade | – | GradeId | CurrentGradeGradeId |
CurrentGrade | – | Id | CurrentGradeId |
CurrentGrade | GradeId | Id | GradeId |
Index
Theo mặc định, EF Core tạo clustered index trên những cột khóa chính và non-clustered index trên những cột khóa ngoại .
Quy ước về mối quan hệ một-nhiều trong EF Core
Ở phần này, bạn sẽ tìm hiểu và khám phá về những quy ước mối quan hệ giữa hai lớp thực thể dẫn đến mối quan hệ một-nhiều giữa những bảng tương ứng trong cơ sở tài liệu .
Entity Framework Core tuân theo quy ước tương tự như các quy ước mối quan hệ một-nhiều trong Entity Framework 6.x. Sự khác biệt duy nhất là EF Core tạo cột khóa ngoại có cùng tên với tên thuộc tính điều hướng chứ không phải là _
như trong Entity Framework.
Chúng ta sẽ xem các quy ước khác nhau trong EF Core tự động cấu hình mối quan hệ một-nhiều giữa các thực thể Student
và Grade
.
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
}
public class Grade
{
public int GradeId { get; set; }
public string GradeName { get; set; }
public string Section { get; set; }
}
Sau khi áp dụng các quy ước cho mối quan hệ một-nhiều trong các thực thể ở trên, các bảng cơ sở dữ liệu cho các thực thể Student
và Grade
sẽ trông giống như hình bên dưới, trong đó bảng Students
có khóa ngoại GradeId
.
Quy ước về mối quan hệ một-một trong EF Core
Entity Framework Core đã trình làng những quy ước mặc định tự động hóa định thông số kỹ thuật mối quan hệ một-một giữa hai thực thể ( EF 6. x hoặc trước đó không tương hỗ những quy ước cho mối quan hệ một-một ) .
Trong EF Core, mối quan hệ một-một đòi hỏi một thuộc tính điều hướng tham chiếu ở cả hai bên. Sau đây các thực thể Student
và StudentAddress
tuân theo quy ước cho mối quan hệ một-một.
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public StudentAddress Address { get; set; }
}
public class StudentAddress
{
public int StudentAddressId { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
public int StudentId { get; set; }
public Student Student { get; set; }
}
Trong ví dụ trên, thực thể Student
có một thuộc tính điều hướng tham chiếu thuộc kiểu StudentAddress
và thực thể StudentAddress
có một thuộc tính khóa ngoại StudentId
và thuộc tính tham chiếu tương ứng của nó là Student
.
Điều này sẽ dẫn đến mối quan hệ một-một trong các bảng tương ứng Students
và StudentAddresses
trong cơ sở dữ liệu, như được hiển thị trong hình bên dưới.
EF Core tạo một unique index trên cột khóa ngoại StudentId
NotNull trong bảng StudentAddresses
, như được hiển thị ở trên.
Điều này đảm bảo rằng giá trị của cột khóa ngoại StudentId
phải là duy nhất trong bảng StudentAddress
, điều cần thiết cho mối quan hệ một-một.
Lưu ý: Ràng buộc duy nhất được hỗ trợ trong Entity Framework Core nhưng không phải trong EF 6 và đó là lý do tại sao EF Core có các quy ước cho mối quan hệ một-một còn EF 6.x thì không có.
Ngoài ra bạn cũng hoàn toàn có thể sử dụng Fluent API để thông số kỹ thuật mối quan hệ một-một nếu những thực thể không tuân theo những quy ước .Bạn hoàn toàn có thể xem hướng dẫn vừa đủ về những quy ước trong Entity Framework Core ở bài viết sau :
Cấu hình trong Entity Framework Core
Bạn đã tìm hiểu và khám phá về những quy ước mặc định trong EF Core trong hướng dẫn trước. Đôi khi tất cả chúng ta muốn tùy chỉnh ánh xạ thực thể thành bảng cơ sở tài liệu và không muốn tuân theo những quy ước mặc định .EF Core được cho phép tất cả chúng ta thông số kỹ thuật những lớp thực thể để tùy chỉnh ánh xạ quy mô EF thành cơ sở tài liệu. Mẫu lập trình này được gọi là Quy ước về Cấu hình .Có hai cách để thông số kỹ thuật những lớp thực thể trong EF Core ( giống như trong EF 6 ) .
- Cấu hình bằng cách sử dụng các attribute chú thích dữ liệu.
- Cấu hình bằng cách sử dụng Fluent API.
Attribute chú thích dữ liệu trong EF Core
Chú thích tài liệu là một phương pháp thông số kỹ thuật dựa trên những attribute trong đó những attribute. NET khác nhau hoàn toàn có thể được vận dụng cho những lớp thực thể và những thuộc tính để thông số kỹ thuật quy mô .
Lưu ý: Bài viết sử dụng thuật ngữ gốc là attribute (thuộc tính) để tránh nhầm lẫn với các thuộc tính (property) của lớp.
Các attribute chú thích tài liệu không riêng gì dành riêng cho Entity Framework, mà chúng cũng được sử dụng trong ASP.NET MVC .Đây là nguyên do tại sao những attribute này được đặt trong namespace riêng không liên quan gì đến nhau là System. ComponentModel. DataAnnotations .Ví dụ sau đây cho thấy cách những attribute chú thích tài liệu hoàn toàn có thể được vận dụng cho một lớp thực thể và những thuộc tính để ghi đè những quy ước mặc định .
[Table("StudentInfo")]
public class Student
{
public Student() { }
[Key]
public int SID { get; set; }
[Column("Name", TypeName="ntext")]
[MaxLength(20)]
public string StudentName { get; set; }
[NotMapped]
public int? Age { get; set; }
public int StdId { get; set; }
[ForeignKey("StdId")]
public virtual Standard Standard { get; set; }
}
Các attribute chú thích tài liệu trong EF 6 và EF Core thì giống nhau. Do đó bạn hoàn toàn có thể truy vấn bài viết Attribute chú thích tài liệu trong Entity Framework để biết thêm thông tin .
Fluent API trong EF Core
Một cách khác để thông số kỹ thuật những lớp thực thể là bằng cách sử dụng Entity Framework Fluent API. EF Fluent API dựa trên mẫu phong cách thiết kế Fluent API ( hay còn gọi là giao diện thông thuộc ) trong đó hiệu quả được tạo thành từ một chuỗi phương pháp .Trong Entity Framework Core, lớp ModelBuilder hoạt động giải trí như một Fluent API. Bằng cách sử dụng nó, tất cả chúng ta hoàn toàn có thể thông số kỹ thuật nhiều thứ khác nhau, vì nó phân phối nhiều tùy chọn thông số kỹ thuật hơn những attribute chú thích tài liệu .Entity Framework Core Fluent API thông số kỹ thuật những góc nhìn sau của một quy mô :
- Cấu hình mô hình: Cấu hình mô hình EF để ánh xạ vào cơ sở dữ liệu. Cấu hình lượng đồ mặc định, các hàm DB, các thuộc tính và thực thể chú thích dữ liệu bổ sung được loại trừ khỏi ánh xạ.
- Cấu hình thực thể: Cấu hình thực thể cho bảng và ánh xạ mối quan hệ, ví dụ: khóa chính, khóa thay thể (AlternateKey), Index, tên bảng, các mối quan hệ như một-một, một-nhiều, nhiều-nhiều, v.v.
- Cấu hình thuộc tính: Cấu hình thuộc tính để ánh xạ cột, ví dụ tên cột, giá trị mặc định, nullable, khóa ngoại, kiểu dữ liệu, cột chống xung đột, v.v.
Bảng sau liệt kê những phương pháp quan trọng cho từng loại thông số kỹ thuật .
Phương thức | Mô tả |
---|---|
Cấu hình mô hình | |
HasDbFunction | Cấu hình chức năng cơ sở dữ liệu. |
HasDefaultSchema | Chỉ định lược đồ cơ sở dữ liệu mặc định. |
HasAnnotation | Thêm hoặc cập nhật các attribute chú thích dữ liệu trên thực thể. |
HasSequence | Cấu hình chuỗi cơ sở dữ liệu. |
Cấu hình thực thể | |
HasAlternateKey | Cấu hình khóa thay thế trong mô hình EF cho thực thể. |
HasIndex | Cấu hình thuộc tính Index cho kiểu thực thể. |
HasKey | Cấu hình thuộc tính khóa chính cho kiểu thực thể. |
HasMany | Cấu hình phần nhiều của mối quan hệ một-nhiều hoặc nhiều-nhiều. |
HasOne | Cấu hình phần một của mối quan hệ một-nhiều hoặc một-một. |
Ignore | Cấu hình lớp thực thể hoặc thuộc tính không được ánh xạ vào bảng hoặc cột trong cơ sở dữ liệu. |
OwnsOne | Cấu hình mối quan hệ trong đó thực thể đích được sở hữu bởi thực thể này. Giá trị khóa thực thể đích được truyền từ thực thể mà nó thuộc về. |
ToTable | Cấu hình tên bảng cho thực thể. |
Cấu hình thuộc tính | |
HasColumnName | Cấu hình tên cột tương ứng của một thuộc tính trong cơ sở dữ liệu. |
HasColumnType | Cấu hình kiểu dữ liệu của cột tương ứng của một thuộc tính trong cơ sở dữ liệu. |
HasComputedColumnSql | Cấu hình thuộc tính để ánh xạ tới cột được tính toán trong cơ sở dữ liệu. |
HasDefaultValue | Cấu hình giá trị mặc định cho cột mà thuộc tính ánh xạ. |
HasDefaultValueSql | Cấu hình biểu thức giá trị mặc định cho cột mà thuộc tính ánh xạ. |
HasField | Chỉ định trường sao lưu được sử dụng với thuộc tính. |
HasMaxLength | Cấu hình độ dài tối đa của dữ liệu có thể được lưu trữ trong một thuộc tính. |
IsConcurrencyToken | Cấu hình thuộc tính được sử dụng làm mã thông báo xung đột. |
IsRequired | Cấu hình thuộc tính bắt buộc nhập dữ liệu khi gọi phương thức SaveChanges. |
IsRowVersion | Cấu hình thuộc tính được sử dụng để phát hiện xung đột. |
IsUnicode | Cấu hình thuộc tính chuỗi có thể chứa các ký tự unicode hoặc không. |
ValueGeneratedNever | Cấu hình một thuộc tính không thể có giá trị được tạo tự động khi thực thể được lưu. |
ValueGeneratedOnAdd | Cấu hình rằng thuộc tính có giá trị được tạo tự động khi lưu thực thể mới. |
ValueGeneratedOnAddOrUpdate | Cấu hình rằng thuộc tính có giá trị được tạo tự động khi lưu thực thể mới hoặc cập nhật thực thể hiện có. |
ValueGeneratedOnUpdate | Cấu hình rằng thuộc tính có giá trị được tạo tự động khi cập nhật thực thể hiện có. |
Cấu hình Fluent API trong EF Core
Ghi đè phương thức OnModelCreating
và sử dụng tham số modelBuilder
kiểu ModelBuilder
để cấu hình các lớp thực thể như ví dụ bên dưới.
public class SchoolDBContext: DbContext
{
public DbSet Students { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Write Fluent API configurations here
//Property Configurations
modelBuilder.Entity()
.Property(s => s.StudentId)
.HasColumnName("Id")
.HasDefaultValue(0)
.IsRequired();
}
}
Trong ví dụ trên, thể hiện của ModelBuilder
được sử dụng để cấu hình một thuộc tính bằng cách gọi một chuỗi nhiều phương thức.
Nó cấu hình thuộc tính StudentId
của thực thể Student
:
StudentId
có tên làId
trong cơ sở dữ liệu bằng cách sử dụng phương thứcHasColumnName
StudentId
có giá trị mặc định là0
bằng cách sử dụng phương thứcHasDefaultValue
StudentId
cho phép nullable bằng phương thứcIsRequired
Các thông số kỹ thuật trên được thực thi trong một câu lệnh thay vì nhiều câu lệnh. Điều này làm tăng năng lực đọc và cũng mất ít thời hạn hơn để viết so với nhiều câu lệnh, như được trình diễn bên dưới .
//Fluent API method chained calls
modelBuilder.Entity()
.Property(s => s.StudentId)
.HasColumnName("Id")
.HasDefaultValue(0)
.IsRequired();
//Separate method calls
modelBuilder.Entity().Property(s => s.StudentId).HasColumnName("Id");
modelBuilder.Entity().Property(s => s.StudentId).HasDefaultValue(0);
modelBuilder.Entity().Property(s => s.StudentId).IsRequired();
Lưu ý: Cấu hình Fluent API có quyền ưu tiên cao hơn các attribute chú thích dữ liệu.
Bạn hoàn toàn có thể xem hướng dẫn rất đầy đủ về thông số kỹ thuật trong Entity Framework Core tại đây :
Truy vấn trong Entity Framework Core
Truy vấn trong Entity Framework Core vẫn giống như truy vấn trong Entity Framework 6. x, với những truy vấn SQL được tối ưu hóa hơn và năng lực đưa những phương pháp C # / VB.NET vào những truy vấn LINQ-to-Entities .Ở phần này, bạn sẽ tìm hiểu và khám phá những tính năng mới của truy vấn được trình làng trong Entity Framework Core .
Phương thức C# / VB.NET trong truy vấn
EF Core có một tính năng mới trong LINQ-to-Entities nơi tất cả chúng ta hoàn toàn có thể thêm những phương pháp C # hoặc VB.NET trong truy vấn. Điều này là không hề trong EF 6 .
private static void Main(string[] args)
{
var context = new SchoolContext();
var studentsWithSameName = context.Students
.Where(s => s.FirstName == GetName())
.ToList();
}
public static string GetName()
{
return "Bill";
}
Eager Loading trong EF Core
Eager Loading là gì?
Eager Loading là quy trình trong đó một truy vấn cho một kiểu thực thể cũng tải những thực thể tương quan như một phần của truy vấn, do đó tất cả chúng ta không cần phải triển khai một truy vấn riêng cho những thực thể tương quan .
Entity Framework Core hỗ trợ Eager Loading các thực thể liên quan, giống như EF 6, sử dụng phương thức mở rộng Include()
và truy vấn tạo kết quả đầu ra.
Ngoài ra, nó cũng cung cấp phương thức mở rộng ThenInclude()
để tải nhiều cấp độ của các thực thể liên quan. (EF 6 không hỗ trợ phương thức ThenInclude()
)
Phương thức Include trong EF Core
Không giống như EF 6, chúng ta có thể chỉ định biểu thức lambda làm tham số trong phương thức Include()
để chỉ định thuộc tính điều hướng như dưới đây.
var context = new SchoolContext();
var studentWithGrade = context.Students
.Where(s => s.FirstName == "Bill")
.Include(s => s.Grade)
.FirstOrDefault();
Phương thức ThenInclude trong EF Core
EF Core đã giới thiệu phương thức mở rộng ThenInclude()
mới để tải nhiều cấp độ của các thực thể liên quan. Hãy xem xét ví dụ sau:
var context = new SchoolContext();
var student = context.Students.Where(s => s.FirstName == "Bill")
.Include(s => s.Grade)
.ThenInclude(g => g.Teachers)
.FirstOrDefault();
Truy vấn tạo kết quả đầu ra
Chúng tôi cũng có thể tải nhiều thực thể liên quan bằng cách sử dụng truy vấn tạo kết quả đầu ra thay vì sử dụng phương thức Include()
hoặc ThenInclude()
.
Ví dụ sau đây cho thấy các truy vấn tạo kết quả đầu ra để tải các thực thể Student
, Grade
và Teacher
.
var context = new SchoolContext();
var stud = context.Students.Where(s => s.FirstName == "Bill")
.Select(s => new
{
Student = s,
Grade = s.Grade,
GradeTeachers = s.Grade.Teachers
})
.FirstOrDefault();
Lazy loading trong EF Core
Lazy loading trì hoãn việc tải những tài liệu tương quan, cho đến khi bạn nhu yếu đơn cử. Lazy loading trái chiều trọn vẹn với Eager loading .Lazy loading được trình làng trong EF Core 2.1 như một tính năng tùy chọn bổ trợ .Lazy loading hoàn toàn có thể được kích hoạt theo hai cách :
- Sử dụng Proxies
- Sử dụng interface
ILazyLoader
Explicit Loading trong EF Core
Ở phần này bạn sẽ tìm hiểu và khám phá làm thế nào để tải những thực thể tương quan trong một biểu đồ thực thể rõ ràng .
Sử dụng phương thức Load()
để tải các thực thể liên quan một cách rõ ràng. Hãy xem xét ví dụ sau.
using (var context = new SchoolContext())
{
var student = context.Students
.Where(s => s.FirstName == "Bill")
.FirstOrDefault();
// loads StudentAddress
context.Entry(student).Reference(s => s.StudentAddress).Load();
// loads Courses collection
context.Entry(student).Collection(s => s.StudentCourses).Load();
}
Bạn hoàn toàn có thể xem hướng dẫn khá đầy đủ về truy vấn trong Entity Framework Core ở bài viết này :
Kịch bản lưu dữ liệu trong Entity Framework Core
Entity Framework Core cung cấp các cách khác nhau để thêm, cập nhật hoặc xóa dữ liệu trong cơ sở dữ liệu. Một thực thể chứa dữ liệu trong thuộc tính của nó sẽ được thêm hoặc cập nhật hoặc xóa dựa trên trạng thái EntityState
của nó.
Có hai kịch bản để lưu dữ liệu thực thể: được kết nối và ngắt kết nối. Trong kịch bản được kết nối, cùng một thể hiện DbContext
được sử dụng trong việc truy xuất và lưu các thực thể, trong khi điều này khác với kịch bản ngắt kết nối.
Lưu dữ liệu trong kịch bản được kết nối trong EF Core
Hình dưới đây minh họa những thao tác CUD ( Create, Update, Delete ) trong ngữ cảnh được liên kết .
Theo hình trên, Entity Framework xây dựng và thực thi các câu lệnh INSERT, UPDATE hoặc DELETE cho các thực thể có trạng thái EntityState
là Added, Modified hoặc Deleted khi phương thức DbContext.SaveChanges()
được gọi.
Trong kịch bản được kết nối, một thể hiện DbContext
theo dõi tất cả các thực thể và do đó, nó sẽ tự động thiết lập một trạng thái EntityState
phù hợp cho mỗi thực thể bất cứ khi nào một thực thể được tạo, sửa đổi hoặc xóa.
Lưu dữ liệu trong kịch bản ngắt kết nối trong EF Core
Lưu dữ liệu trong ngữ cảnh ngắt liên kết hơi khác một chút ít so với ngữ cảnh được liên kết .
Trong kịch bản bị ngắt kết nối, DbContext
không biết các thực thể bị ngắt kết nối vì các thực thể đã được thêm hoặc sửa đổi ngoài phạm vi của thể hiện DbContext
hiện tại.
Vì vậy, bạn cần đính kèm (attach) các thực thể bị ngắt kết nối vào một Context với trạng thái EntityState
phù hợp để thực hiện các thao tác CUD (Create, Update, Delete) vào cơ sở dữ liệu.
Hình dưới đây minh họa những thao tác CUD trong ngữ cảnh ngắt liên kết :
Theo hình trên, các thực thể bị ngắt kết nối (các thực thể không được theo dõi bởi DbContext
) cần phải được đính kèm vào DbContext
với trạng thái EntityState
phù hợp.
Ví dụ: Trạng thái Added cho các thực thể mới, trạng thái Modified cho các thực thể đã chỉnh sửa và trạng thái Deleted cho các thực thể bị xóa, điều này sẽ thực thi các lệnh INSERT, UPDATE hoặc DELETE trong cơ sở dữ liệu khi phương thức SaveChanges()
được gọi.
Bạn có thể xem hướng dẫn đầy đủ về kịch bản lưu dữ liệu trong Entity Framework Core ở bài viết này:
Xem thêm: 0283 là mạng gì, ở đâu? Cách nhận biết nhà mạng điện thoại bàn cố định – http://139.180.218.5
Còn tiếp
Nếu Comdy hữu ích và giúp bạn tiết kiệm thời gian
Bạn hoàn toàn có thể vui mắt tắt trình chặn quảng cáo ❤ ️ để tương hỗ chúng tôi duy trì hoạt động giải trí của website .
Source: http://139.180.218.5
Category: Thuật ngữ đời thường