Entity framework code first là gì

Share:

Giới thiệu về thư viện EF Core, thư viện cung cấp khả năng ánh xạ đối tượng người sử dụng lập trình cùng với các đối tượng người sử dụng CSDL, cơ bạn dạng dùng EF để chế tạo DB, đọc, ghi, xóa dữ liệu, sử dụng Linq để tiến hành các truy hỏi vấn.

Bạn đang đọc: Entity framework code first là gì


EF Core là framework (thư viện khung) để ánh xạ những đơn vị dữ liệu mô tả bằng lớp (đối tượng) vào cơ sở tài liệu quan hệ, nó được cho phép ánh xạ vào các bảng CSDL, tạo CSDL, truy hỏi vấn với LINQ, chế tác và cập nhật vào database.

Để sử dụng EF chip core hãy thêm số đông package cần thiết vào, chạy những lệnh sau:

dotnet showroom package System.Data.SqlClientdotnet showroom package Microsoft.EntityFrameworkCoredotnet địa chỉ package Microsoft.EntityFrameworkCore.SqlServerdotnet showroom package Microsoft.EntityFrameworkCore.Designdotnet địa chỉ cửa hàng package Microsoft.Extensions.DependencyInjectiondotnet địa chỉ cửa hàng package Microsoft.Extensions.Loggingdotnet add package Microsoft.Extensions.Logging.Console các namespace rất có thể dùng:

using Microsoft.EntityFrameworkCore;using Microsoft.EntityFrameworkCore.ChangeTracking;using Microsoft.EntityFrameworkCore.Diagnostics;using Microsoft.EntityFrameworkCore.Infrastructure;using Microsoft.EntityFrameworkCore.Metadata.Builders;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Logging;using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Linq;using System.Threading.Tasks;

Tạo model đơn giản, ánh xạ bảng CSDL


mã sản phẩm là mô hình hóa các đối tượng người sử dụng dữ liệu vào hệ cai quản trị cơ sở dữ liệu thành các đối tượng người sử dụng lập trình, kia là các lớp (class) tương xứng với các bảng ... Hãy tạo nên một dự án Console trong thư mục ef01 có cài đặt các package trên để thực hành. Ở đây tạo thành một mã sản phẩm đơn giản, lớp mang tên Product biểu diễn những dòng trong bảng của CDSL, bảng này tên là Products

Trước tiên, lớp này định nghĩa thuần túy gồm các thuộc tính như sau:

using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;namespace ef01 public class hàng hóa public int ProductId set; get; public string Name set; get; public string Provider set; get; trước khi sử dụng mã sản phẩm Product trong EF Core, hãy bổ sung cập nhật các tùy chỉnh thông qua các Attribute (sử dụng áp dụng Attribute) như sau:

thiết lập cấu hình lớp sản phẩm là ánh xạ bảng Products, cần sử dụng thuộc tính Table nhằm thiết lập: trường Name đề nghị phải tùy chỉnh (khác null) dùng thuộc tính , với độ dài về tối là là 50 cam kết tự với nằm trong tính

using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;namespace ef01 public class product public int ProductId set; get; public string Name set; get; public string Provider set; get; Đây là khai báo một tấm bình thường, chỉ có bổ sung cập nhật thêm vài thuộc tính diễn tả (Attribute) đến lớp, trực thuộc tính - các Attribute này được áp dụng bởi EF.


Tạo Context - DbContext

DbContext trong EF là ngữ cảnh có tác dụng việc, nó biểu diễn, chứa những thông tin quan trọng của một phiên thao tác làm việc với CSDL.


Để thực hiện tạo nên mối tương tác bảng Products tong database và model, tạo ra Context như sau: sản xuất lớp thừa kế DbContext khắc tên là ProductsContext, lớp này mang ý nghĩa như là một trong CSDL.

Trong đó yêu cầu nạp ck OnConfiguring để thông số kỹ thuật (thiết lập chuỗi liên kết ...), và tạo nên thuộc tính có kiểu DbSet chính là bảng trong CSDL


cần có một SQL server để liên kết đến, nếu chưa xuất hiện thì gồm thể thiết lập nhanh bên trên Docker coi phần sẵn sàng SQL hệ thống hoặc thực hiện theo giải đáp SQL vps trên Docker, chúng ta cũng cần nắm vững kỹ thuật xây dựng bất đồng điệu trước, coi tại thiết kế bất đồng hóa C# await/async

using Microsoft.EntityFrameworkCore;namespace ef01 public class ProductsContext : DbContext // thuộc tính products hình dáng DbSet cho thấy CSDL tất cả bảng nhưng // tin tức về bảng dữ liệu biểu diễn bởi model Product public DbSet products set; get; // Chuỗi kết nối tới cơ sở dữ liệu (MS SQL Server) private const string connectionString =
" Data Source=localhost,1433; Initial Catalog=mydata; User ID=SA;Password=Password123"; // thủ tục OnConfiguring gọi mọi khi một đối tượng người sử dụng DbContext được chế tạo // Nạp ck nó để cấu hình thiết lập các cấu hình, như cấu hình thiết lập chuỗi liên kết protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) base.OnConfiguring(optionsBuilder); optionsBuilder.UseSqlServer(connectionString); s từ bỏ lớp thừa kế DbContext là ProductsContext rất có thể tương tác cùng với CSDL bằng phương pháp gọi những phương thức phù hợp trong DbContext, mày mò một số trường hợp dễ dàng sau đây.

Xem thêm: Công Ty Tnhh Mtv Kinh Doanh Ô Tô Thanh Xuân, Tuyển Dụng


Tạo với xóa Database

DbContext gồm thuộc tính Database, trực thuộc tính này là đối tượng kiểu DatabaseFacade, tự đó hoàn toàn có thể tạo / xóa database.

EnsureCreatedAsync là phươnng thức của DatabaseFacade để tạo thành database, ví như database nó đã không tồn tại, ví như DB sẽ tồn trên thì không làm cái gi cả.

// chế tác Database mydata (tên mydata từ tin tức kết nối)// Gồm tất cả các bảng khái niệm bởi những thuộc tính hình dáng DbSetpublic static async Task CreateDatabase() using (var dbcontext = new ProductsContext()) String databasename = dbcontext.Database.GetDbConnection().Database;// mydata Console.WriteLine("Tạo " + databasename); bool result = await dbcontext.Database.EnsureCreatedAsync(); string resultstring = result ? "tạo thành công" : "đã có trước đó"; Console.WriteLine($"CSDL databasename : resultstring"); Chạy thử cách thức trong hàm Main

static async Task Main(string<> args) await CreateDatabase();// tạo nên mydata// database mydata : tạo thành công Thi hành thì nó sẽ tạo ra database, nếu như DB đó không có! Database này sản xuất ra có tên mydata, có một bảng thương hiệu Products với cấu trúc giống biểu lộ trong mã sản phẩm Product

*

DeleteDatabase là phươnng thức của DatabaseFacade nhằm xóa CSDL.

public static async Task DeleteDatabase() using (var context = new ProductsContext()) String databasename = context.Database.GetDbConnection().Database; Console.Write($"Có chắc chắn xóa databasename (y) ? "); string input đầu vào = Console.ReadLine(); // Hỏi lại cho chắc if (input.ToLower() == "y") bool deleted = await context.Database.EnsureDeletedAsync(); string deletionInfo = deleted ? "đã xóa" : "không xóa được"; Console.WriteLine($"databasename deletionInfo"); phương thức EnsureDeletedAsync, EnsureCreatedAsync cần sử dụng kỹ thuật async, nếu còn muốn dùng phiên bản đồng cỗ thì là EnsureDeleted, EnsureCreated

Chèn dữ liệu vào những bảng, AddAsync, AddRangeAsync, SaveChangesAsync

Các đối tượng DbContext tốt DbSet (như trực thuộc tính products của lớp ProductContext sinh hoạt trên) gồm phương thức AddAsync để bạn chèn đối tượng phù hợp vào DbContext, nó dìm tham số là đối tượng Model cần chèn vào. Tiếp đến gọi cách làm SaveChangesAsync để thực hiện update dữ liệu vào vps SQL

// thực hiện chèn hai dòng tài liệu vào bảng Product// sử dụng AddAsync trong DbSet cùng trong DbContextpublic static async Task InsertProduct() using (var context = new ProductsContext()) // Thêm thành phầm 1 await context.products.AddAsync(new sản phẩm Name = "Sản phẩm 1", Provider = "Công ty 1" ); // Thêm sản phẩm 2 await context.AddAsync(new Product() Name = "Sản phẩm 2", Provider = "Công ty 1" ); // thực hiện cập nhật chuyển đổi trong DbContext lên hệ thống int rows = await context.SaveChangesAsync(); Console.WriteLine($"Đã lưu rows sản phẩm"); Chạy thử:

static async Task Main(string<> args) await InsertProduct();

*
nếu muốn thêm một thời điểm nhiều tài liệu thì cần sử dụng AddRangeAsync, nó có thể nhận đối số là mảng các đối tượng người sử dụng cần chèn vào

var p1 = new Product() Name = "Sản phẩm 3", Provider = "CTY A";var p2 = new Product() Name = "Sản phẩm 4", Provider = "CTY A";var p3 = new Product() Name = "Sản phẩm 5", Provider = "CTY B";await context.AddRangeAsync(new object<> p1, p2, p3);int rows = await context.SaveChangesAsync();Console.WriteLine($"Đã lưu lại rows sản phẩm");

Đọc dữ liệu từ bảng, truy nã vấn với LINQ

Các đối tượng DbSet bao gồm phương thức ToListAsync() hay ToArrayAsync() để đưa về toàn bộ các tài liệu (List) của bảng. Đặc biệt bạn có thể dùng LINQ ( đọc Linq C#) bên trên các đối tượng người dùng này (nguồn là những DbSet)

public static async Task ReadProducts() using (var context = new ProductsContext()) // context.SetLogging(); // Lấy danh sách các thành phầm trong bảng var products = await context.products.ToListAsync(); Console.WriteLine("Tất cả sản phẩm"); foreach (var hàng hóa in products) Console.WriteLine($"product.ProductId,2 product.Name, 10 - product.Provider"); Console.WriteLine(); Console.WriteLine(); // dùng LINQ nhằm truy vấn mang lại DbSet products (bảng product) // Lấy những sản phẩm cung ứng bởi CTY A products = await (from p. In context.products where (p.Provider == "CTY A") select p. ) .ToListAsync(); // nếu không dùng bất đồng bộ chỗ này, có thể dùng // var pros = from p. In context.products where (p.Provider == "CTY A") select p; Console.WriteLine("Sản phẩm CTY A"); foreach (var sản phẩm in products) Console.WriteLine($"product.ProductId,2 product.Name, 10 - product.Provider");

*

Cập nhật tài liệu trong EF

Muốn update dữ liệu, chỉ việc chuyển đổi thuộc tính của đối tượng người sử dụng đọc được, sau đó gọi context.SaveChangesAsync

// Đổi tên thành phầm có ProductID thành thương hiệu mớipublic static async Task RenameProduct(int id, string newName) using (var context = new ProductsContext()) // đem Product có ID sản phẩm chỉ ra var hàng hóa = await (from phường in context.products where (p.ProductId == id) select p).FirstOrDefaultAsync(); // Đổi tên và update if (product != null) product.Name = newName; Console.WriteLine($"product.ProductId,2 mang tên mới = product.Name, 10"); await context.SaveChangesAsync(); //Thi hành update nếu còn muốn một đối tượng riêng lẻ, không đo lường và tính toán - ước ao thực hiện cập nhật thì hotline đến cách tiến hành Update của DbSet

context.products.Update(p); nếu muốn cập nhật một số trường nào đó, sử dụng cách cập nhật đối tượng độc lập

// chế tác đối tượngvar truyền bá = new Product() ProductId = 4, Name = "Abc" ;// đính pr vào context để theo dõi, nó trả vể đối tượng người sử dụng EntityEntryEntityEntry pr_e = context.Attach(pr);// lấy thuộc tính Name của hàng hóa và cấu hình thiết lập nó buộc phải cập nhật// cùng với IsModified = true;pr_e.Property(p => p.Name).IsModified = true;context.SaveChanges();Lưu ý, các đối tượng như Product tác dụng truy vấn, hoặc được sản xuất ... Thì khoác định là được giám sát - theodõi vì chưng EF. Khi những đối tượng người dùng này biến hóa trạng thái thì context.SaveChanges() đang thực hiệncác tác vụ dựa vào trạng thái của nó.

Mỗi loại Product trả về từ tróc nã vấn, hoặc cung ứng thì vào EF tất cả một đối tượng EntityEntry tương ứngđể để quản lý. Để mang EntityEntry hoàn toàn có thể dùng cách thức Entry, bạn có thể dùng nó để biến hóa trạng thái thủ công,ví dụ để kiểm soát và điều chỉnh sự tác động khi gọi SaveChange. Ví dụ, loại trừ không bị sút sát vì EF cho đối tượng product nhận được

EntityEntry eProduct = context.Entry(product);eProduct.State = EntityState.Detached;Có một vài state gồm: Added, Deleted, Detached, Modified, Unchanged

Xóa dữ liệu trong EF

Để xóa dữ liệu khỏi DB, chỉ việc yêu cầu xóa đối tượng người dùng khỏi DbContext bằng phương thức Remove, rồi điện thoại tư vấn SaveChangesAsync nhằm cập nhật

// Xóa sản phẩm có ProductID = idpublic static async Task DeleteProduct(int id) using (var context = new ProductsContext()) // context.SetLogging(); var hàng hóa = await (from phường in context.products where (p.ProductId == id) select p).FirstOrDefaultAsync(); if (product != null) context.Remove(product); Console.WriteLine($"Xóa product.ProductId"); await context.SaveChangesAsync();

EF Logger hiện thị SQL Query trên terminal

nếu như muốn thật sự những câu truy hỏi vấn bởi EF, Linq ra đời để tương tác với Database thì thêm loger như sau, sản xuất lớp ProductContext cách thức SetLogging:

using System;using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.Logging;using Microsoft.Extensions .DependencyInjection;using Microsoft.EntityFrameworkCore.Infrastructure;/.. Public void SetLogging() IServiceProvider provider = this.GetInfrastructure(); ILoggerFactory loggerFactory = provider.GetService(); loggerFactory.AddConsole(); /..

*
Mã nguồn - Source code

EF Logger trong .Net core 3.x

Đối với .Net bộ vi xử lý core 3.x để cấu hình thiết lập Logger in tin tức tại console thì cần tạo thành một ILoggerFactory, sau đó tùy chỉnh sử dụng nó ở cách thức OnConfiguring của lớp ProductsContext

Đầu tiên hãy bảo đảm cài đặt những Package mới nhất:

dotnet địa chỉ cửa hàng package Microsoft.Extensions.DependencyInjectiondotnet add package Microsoft.Extensions.Loggingdotnet add package Microsoft.Extensions.Logging.Console tạo thành ILoggerFactory như sau:

ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddConsole(););Mặc định ILoggerFactory này bắt tất cả các sự kiện, nếu như muốn tùy chỉnh các category mong muốn lọc cũng giống như cấp độ thì gọi thêm phương thức AddFilter khi tạo ILoggerFactory, ví dụ:

ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder .AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Warning) .AddFilter(DbLoggerCategory.Query.Name, LogLevel.Debug) .AddConsole(););Trường đúng theo trên tùy chỉnh thiết lập lọc các log thuộc thể loại DbLoggerCategory.Database.Command.Name ở tại mức độ LogLevel.Warning và chuyên mục DbLoggerCategory.Query.Name tại mức độ LogLevel.Debug

Các cấp cho khác coi tại: LogLevel

Các tên category tham khảo đối với EF Logger: DbLoggerCategory.Database.Command, DbLoggerCategory.Database.Connection, DbLoggerCategory.Database.Transaction, DbLoggerCategory.Infrastructure, DbLoggerCategory.Migration, DbLoggerCategory.Model, DbLoggerCategory.Query, DbLoggerCategory.Scaffolding, DbLoggerCategory.Update

Ví dụ - cấu hình thiết lập hoàn chỉnh đến lớp ProductsContext

using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.Logging;namespace ef01 public class ProductsContext : DbContext // tạo ILoggerFactory public static readonly ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder .AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Warning) .AddFilter(DbLoggerCategory.Query.Name, LogLevel.Debug) .AddConsole(); ); private const string connectionString = " ... "; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) base.OnConfiguring(optionsBuilder); optionsBuilder .UseLoggerFactory(loggerFactory) // - thiết lập sử Logger .UseSqlServer(connectionString); public DbSet products set; get; tìm hiểu thêm mã mối cung cấp , hoặc sở hữu về ex041

Bài viết liên quan