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.
Để 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
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.
PM> Scaffold-DbContext "Server=.\;Database=DemoEFCore;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Model -Context "EFCoreContext" -DataAnnotations
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.
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; }
}
Để 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; }
}
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"));
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.
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 ...
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.
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.