Chúng ta có thể chèn dữ liệu lớn nhanh hơn 20 lần so với cách chèn thông thường. Chúng ta thử xem so sánh bên dưới
Trong bài viết này, mình sẽ hướng dẫn các bạn về cách chèn dữ liệu (cụ thể là 100000 dữ liệu) bằng cách sữ dụng BULK, làm có việc thêm dữ liệu của chúng ta tăng performance (nhanh hơn).- Project Setup
Đầu tiên sau khi tạo một Project thì tiếp ngay sau đó thì chúng ta cài đặt những thư viện cần dùng đến trong project này . Nhớ là đồng bộ theo đúng 1 version nhá
Bước 1: Cài đặt các Nuget Package
Bước 2: Tạo một Model :
Tạo một mô hình và DbContext nơi chúng ta có thể thực hiện việc tạo bảng trong Cơ sở dữ liệu SQL với thiết lập cấu hình.using System.ComponentModel.DataAnnotations;
namespace BulkSolution.Entities
{
public class Employee
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Designation { get; set; }
public string City { get; set; }
}
}
using BulkSolution.Entities; using Microsoft.EntityFrameworkCore; namespace BulkSolution.EF { public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptionsoptions) : base(options) { } public DbSet Employees { get; set; } } }
Bước 4: Cấu hình ở appsetting.json
{ "ConnectionStrings": { "DefaultConnection": "Server=CNPM-PC\\MSSQLSERVER01;Database=DBBulk;Trusted_Connection=True;MultipleActiveResultSets=true" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
Bước 5: Ở Program.cs và thêm đoạn code sau vào bên trong :
services.AddDbContext(options =>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddScoped ();
- Add-Migration InitialCreate
- Update-database
Chúng ta sẽ tạo theo như hình dưới là oke
Bước 7: Chúng ta tạo tầng Services:
using BulkSolution.EF; using BulkSolution.Entities; using EFCore.BulkExtensions; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace BulkSolution.Services { public class EmployeeService { private readonly ApplicationDbContext _appDbContext; private DateTime Start; private TimeSpan TimeSpan; //The "duration" variable contains Execution time when we doing the operations (Insert,Update,Delete) public EmployeeService(ApplicationDbContext appDbContext) { _appDbContext = appDbContext; } #region Add Bulk Data public async TaskAddBulkDataAsync() { List employees = new(); // C# 9 Syntax. Start = DateTime.Now; for (int i = 0; i < 100000; i++) { employees.Add(new Employee() { Name = "Employee_" + i, Designation = "Designation_" + i, City = "City_" + i }); } await _appDbContext.BulkInsertAsync(employees); TimeSpan = DateTime.Now - Start; return TimeSpan; } #endregion #region Update Bulk Data public async Task UpdateBulkDataAsync() { List employees = new(); // C# 9 Syntax. Start = DateTime.Now; for (int i = 0; i < 100000; i++) { employees.Add(new Employee() { Id = (i + 1), Name = "Update Employee_" + i, Designation = "Update Designation_" + i, City = "Update City_" + i }); } await _appDbContext.BulkUpdateAsync(employees); TimeSpan = DateTime.Now - Start; return TimeSpan; } #endregion #region Delete Bulk Data public async Task DeleteBulkDataAsync() { List employees = new(); // C# 9 Syntax. Start = DateTime.Now; employees = _appDbContext.Employees.ToList(); await _appDbContext.BulkDeleteAsync(employees); TimeSpan = DateTime.Now - Start; return TimeSpan; } #endregion } }
using BulkSolution.Services; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; namespace BulkSolution.Controllers { [Route("api/[controller]")] [ApiController] public class BulkController : Controller { private readonly EmployeeService _employeeService; public BulkController(EmployeeService employeeService) { _employeeService = employeeService; } [HttpPost(nameof(AddBulkData))] public async TaskAddBulkData() { var response = await _employeeService.AddBulkDataAsync(); return Ok(response); } [HttpPut(nameof(UpdateBulkData))] public async Task UpdateBulkData() { var response = await _employeeService.UpdateBulkDataAsync(); return Ok(response); } [HttpDelete(nameof(DeleteBulkData))] public async Task DeleteBulkData() { var response = await _employeeService.DeleteBulkDataAsync(); return Ok(response); } } }