.NET 8 Framework C# (C-Sharp) Entity Framework Core

CRUD (Create, Read, Update, Delete)

ตัวอย่างการเขียนโปรแกรม CRUD จัดการข้อมูลพนักงานด้วย ASP.NET Core และ Entity Framework (EF) Core, .NET 8 Framework, C# (C-Sharp)

CRUD (Create, Read, Update, Delete)
Ake SuwaphanAke Suwaphan
14 February 2024

CRUD (Create, Read, Update, Delete)

CRUD คืออะไร และมาตราฐาน CRUD สำหรับการเขียนโปรแกรม คืออะไร

CRUD ย่อมาจาก Create, Read, Update, Delete เป็นมาตราฐานที่ใช้ในการเขียนโปรแกรมสำหรับจัดการข้อมูล การเขียนโปรแกรมแบบ CRUD นั้น ยังมักใช้กับระบบฐานข้อมูลต่างๆ อีกด้วย เช่น SQL Server, MySQL, PostgreSQL, MongoDB เป็นต้น มาตราฐาน CRUD นี้ประกอบไปด้วย 4 ฟังก์ชั่นหลัก ดังนี้

  • Create (สร้าง) คือ การเพิ่มข้อมูลใหม่เข้าสู่ระบบ
  • Read (อ่าน) คือ การดึงข้อมูลจากระบบ
  • Update (อัปเดต) คือ การแก้ไขข้อมูลที่มีอยู่
  • Delete (ลบ) คือ การลบข้อมูลออกจากระบบ

ตัวอย่างการเขียนโปรแกรม CRUD จัดการข้อมูลพนักงานด้วย ASP.NET Core และ Entity Framework (EF) Core, .NET 8 Framework, C# (C-Sharp)

1. ออกแบบฐานข้อมูล สร้างตาราง "Employees" ที่มีคอลัมน์ต่อไปนี้

Id (int, Primary Key) ,FirstName (nvarchar) ,LastName (nvarchar) ,Email (nvarchar) ,PhoneNumber (nvarchar) ,Department (nvarchar)


    CREATE TABLE Employees (
        EmployeeId INT PRIMARY KEY,
        FirstName NVARCHAR(255),
        LastName NVARCHAR(255),
        Email NVARCHAR(255),
        PhoneNumber NVARCHAR(255),
        Department NVARCHAR(255)
    );

2. เพิ่ม Employee Model (Models/Employee.cs)

    public class Employee
    {
        public int EmployeeId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string PhoneNumber { get; set; }
        public string Department { get; set; }
    }

3. เพิ่ม DbContext เพื่อเข้าถึงฐานข้อมูล (Data/AppDbContext.cs)

    using Microsoft.EntityFrameworkCore;

    public class AppDbContext : DbContext
    {
        public DbSet<Customer> Customers { get; set; }

        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
        {
        }
    }

4. เพิ่ม ConnectionStrings สำหรับฐานข้อมูล SQL Server ใน appsettings.json และกำหนดค่า DbContext ใน Program.cs

    {
      "ConnectionStrings": {
        "DefaultConnection": "Server=YourServer\\mssqllocaldb;Database=YourDatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true"
      },
    }


    using Microsoft.EntityFrameworkCore;

    // Add services to the container.
    builder.Services.AddDbContext<AppDbContext>(
            options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));

5.เพิ่ม Controller ในการจัดการข้อมูลพนักงาน (Controllers/EmployeesController.cs)


    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    using System.Linq;
    using System.Threading.Tasks;

    public class EmployeesController : Controller
    {
        private readonly AppDbContext _context;

        public EmployeesController(AppDbContext context)
        {
            _context = context;
        }

        public async Task<IActionResult> Index()
        {
            var employees = await _context.Employees.ToListAsync();
            return View(employees);
        }

        public IActionResult Create()
        {
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("EmployeeId,FirstName,LastName,Email,PhoneNumber,Department")] Employee employee)
        {
            if (ModelState.IsValid)
            {
                _context.Add(employee);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(employee);
        }

        public async Task<IActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var employee = await _context.Employees.FindAsync(id);
            if (employee == null)
            {
                return NotFound();
            }
            return View(employee);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(int id, [Bind("EmployeeId,FirstName,LastName,Email,PhoneNumber,Department")] Employee employee)
        {
            if (id != employee.EmployeeId)
            {
                return NotFound();
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(employee);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    .if (!EmployeeExists(employee.EmployeeId))
                    {
                        .return NotFound();
                    }
                    .else
                    {
                        .throw;
                    }
                }
                return RedirectToAction(nameof(Index));
            }
            return View(employee);
        }

        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var employee = await _context.Employees
                .FirstOrDefaultAsync(m => m.EmployeeId == id);
            if (employee == null)
            {
                return NotFound();
            }

            return View(employee);
        }

        public async Task<IActionResult> Delete(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var employee = await _context.Employees
                .FirstOrDefaultAsync(m => m.EmployeeId == id);
            if (employee == null)
            {
                return NotFound();
            }

            return View(employee);
        }

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(int id)
        {
            var employee = await _context.Employees.FindAsync(id);
            _context.Employees.Remove(employee);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }

        private bool EmployeeExists(int id)
        {
            return _context.Employees.Any(e => e.EmployeeId == id);
        }
    }


จากตัวอย่างโปรแกรมทั้งหมดนี้จะทำให้ได้ระบบ CRUD พนักงานพร้อมกับการจัดการฐาน โดยจะสามารถ สร้าง Views สำหรับแสดงรายการพนักงาน (Index, Create, Edit, Details, Delete) ภายใน Views/Employees โดยใช้ Razor View Engine

สำหรับการจัดการใช้ฟังก์ชันต่าง ๆ ของโปรแกรมเพื่อคืนค่าการตอบกลับที่เหมาะสมตามสถานการณ์ต่างๆ จาก ตัวอย่างฟังก์ชันที่ใช้ ได้แก่

  • BadRequest() = "400 Bad Request"
  • NotFound() = "404 Not Found"
  • NoContent() = "204 No Content"

โดยการใช้ฟังก์ชันเหล่านี้จะช่วยให้โปรแกรมสามารถสื่อสารสถานะของการดำเนินการได้เป็นอย่างดี ไม่ว่าจะเป็นการบันทึกข้อมูล, ค้นหาข้อมูล, หรือลบข้อมูล