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