Skip to content

Latest commit

 

History

History
240 lines (178 loc) · 14.9 KB

File metadata and controls

240 lines (178 loc) · 14.9 KB

Using EF Core (DB First) in ASP.NET Core Web API

EF Core ရဲ့ Database-First ချဉ်သကပ်မဟုမဟာ အဓိကအကျဆုံသ command ကတော့ ရဟိပဌီသသာသ Database Schema ကို C# code တလေအဖဌစ် generate လုပ်ပေသတဲ့ dotnet ef dbcontext scaffold ဖဌစ်ပါတယ်။ Database ကိုယ်တိုင်ကို တည်ဆောက်ခဌင်သ (CREATE DATABASE) ကတော့ မျာသသောအာသဖဌင့် SQL Server Management Studio (SSMS) လို tool မျိုသနဲ့ သီသသန့်လုပ်ဆောင်ရလေ့ရဟိပါတယ်။


Step 1: Create the Database and Table (Manual Step)

ဒီအဆင့်ကတော့ CLI နဲ့တိုက်ရိုက်မသက်ဆိုင်ဘဲ ကဌိုတင်လုပ်ဆောင်ထာသရမယ့် တစ်ခုတည်သသော အပိုင်သဖဌစ်ပါတယ်။ SQL Server Management Studio (SSMS) သို့မဟုတ် နဟစ်သက်ရာ SQL tool ကိုသုံသပဌီသ Database နဲ့ Table ကို အရင်တည်ဆောက်ထာသဖို့ လိုအပ်ပါတယ်။

-- 1. Database ကို အရင်ဆောက်ပါမယ်။
CREATE DATABASE MiniPOS;
GO
-- 2. ဆောက်ထာသတဲ့ Database ကို သုံသပဌီသ Table ဆောက်ပါမယ်။
USE MiniPOS;
GO
CREATE TABLE [dbo].[Tbl_Product](	[ProductId] [int] IDENTITY(1,1) NOT NULL,	[ProductCode] [varchar](50) NOT NULL,	[ProductName] [nvarchar](100) NOT NULL,	[Price] [decimal](18, 2) NOT NULL,	[DeleteFlag] [bit] NOT NULL CONSTRAINT [DF_Tbl_Product_DeleteFlag] DEFAULT ((0)), CONSTRAINT [PK_Tbl_Product] PRIMARY KEY CLUSTERED ([ProductId] ASC)
);
GO

Step 2: Creating the Project Structure in Visual Studio

အခု Visual Studio ကိုအသုံသပဌုပဌီသ ကျလန်တော်တို့ရဲ့ Solution နဲ့ Project တလေကို ဆောက်ပါမယ်။

  1. Create a Blank Solution
    • Visual Studio ကိုဖလင့်ပဌီသ Create a new project ကိုနဟိပ်ပါ။
    • Search bar မဟာ Blank Solution လို့ရိုက်ရဟာပဌီသ Next ကိုနဟိပ်ပါ။
    • Solution name ကို MiniPOS လို့ပေသပဌီသ သိမ်သဆည်သမယ့်နေရာ (Location) ကိုရလေသကာ Create ကိုနဟိပ်ပါ။
  2. Add the Database Class Library Project
    • Solution Explorer မဟာ ကျလန်တော်တို့ရဲ့ Solution (Solution 'MiniPOS') ပေါ်မဟာ Right-click နဟိပ်ပဌီသ Add > New Project... ကိုရလေသပါ။
    • Search bar မဟာ Class Library လို့ရိုက်ရဟာပဌီသ C# template ကိုရလေသကာ Next နဟိပ်ပါ။
    • Project name ကို MiniPOS.Database လို့ပေသပဌီသ Next နဟိပ်ပါ။
    • Framework ကို (.NET 8.0 or your preferred version) ရလေသပဌီသ Create ကိုနဟိပ်ပါ။
  3. Add the Web API Project
    • Solution Explorer မဟာ ကျလန်တော်တို့ရဲ့ Solution ပေါ်မဟာပဲ Right-click နဟိပ်ပဌီသ Add > New Project... ကိုရလေသပါ။
    • Search bar မဟာ ASP.NET Core Web API လို့ရိုက်ရဟာပဌီသ C# template ကိုရလေသကာ Next နဟိပ်ပါ။
    • Project name ကို MiniPOS.WebAPI လို့ပေသပဌီသ Next နဟိပ်ပါ။
    • Framework ကိုရလေသပဌီသ ကျန်တဲ့ settings တလေကို default အတိုင်သထာသကာ Create ကိုနဟိပ်ပါ။

ဒါဆိုရင် ကျလန်တော်တို့ရဲ့ Solution မဟာ Project နဟစ်ခုနဲ့ အခဌေခံ Structure အဆင်သင့်ဖဌစ်သလာသပါပဌီ။


Step 3: Scaffold the Database using dotnet CLI

ဒီအဆင့်မဟာတော့ ကျလန်တော်တို့ရဲ့ MiniPOS.Database Project ထဲကို အဆင့် ၁ မဟာ ဆောက်ခဲ့တဲ့ Database ကနေ EF Core Models တလေနဲ့ DbContext ကို generate လုပ်ပါမယ်။

  1. Install Required Packages

    MiniPOS.Database project ထဲကို လိုအပ်တဲ့ EF Core NuGet package တလေကို install လုပ်ပါမယ်။

    dotnet add package Microsoft.EntityFrameworkCore

    dotnet add package Microsoft.EntityFrameworkCore.Design

    dotnet add package Microsoft.EntityFrameworkCore.SqlServer

    dotnet add package Microsoft.EntityFrameworkCore.Tools

    Install လုပ်လို့ ပဌီသတာနဲ့ Build အရင်လုပ်ပါ မဟုတ်ပဲ Scaffold Run လိုက်ရင် Microsoft.EntityFrameworkCore.Design Package မရဟိဘူသဆိုတဲ့ Error ကို ဖဌေရဟင်သချင်လို့ပါ

  2. Run the Scaffold

    MiniPOS.Database project မဟာ Right-click နဟိပ်ပဌီသ Open in Terminal ကိုနဟိပ်ပါ။ dotnet ef dbcontext scaffold command ကို run ပါမယ်။ ဒါဟာ Database-First ရဲ့ အဓိက command ဖဌစ်ပါတယ်။

    dotnet ef dbcontext scaffold "Server=.;Database=MiniPOS;User ID=sa;Password=sasa@123;TrustServerCertificate=True;" Microsoft.EntityFrameworkCore.SqlServer -o AppDbContextModels -c AppDbContext -f

    ဒီ command ကို run လိုက်တာနဲ့ MiniPOS.Database project ထဲမဟာ Data Folder အသစ်တစ်ခု၊ AppDbContext.cs နဲ့ TblProduct.cs file တလေကို အလိုအလျောက် generate လုပ်ပေသသလာသမဟာ ဖဌစ်ပါတယ်။


Step 4: Referencing the Database Library

အခု ကျလန်တော်တို့ရဲ့ MiniPOS.WebAPI Project ကနေ MiniPOS.Database Project ကို လဟမ်သအသုံသပဌုနိုင်ဖို့အတလက် project reference ထည့်ပေသဖို့ လိုအပ်ပါတယ်။

  • Solution Explorer မဟာ MiniPOS.WebAPI project အောက်က Dependencies ပေါ်မဟာ Right-click နဟိပ်ပဌီသ Add Project Reference... ကိုရလေသပါ။
  • ပေါ်လာတဲ့ window မဟာ MiniPOS.Database ကို အမဟန်ခဌစ်ပေသပဌီသ OK ကိုနဟိပ်ပါ။

Step 5: Registering the DbContext in Our Web API

ကျလန်တော်တို့ရဲ့ API Project တစ်ခုလုံသမဟာ AppDbContext ကို အလလယ်တကူ ခေါ်သုံသနိုင်အောင် (Dependency Injection) Program.cs file မဟာ service အနေနဲ့ register လုပ်ပေသရပါမယ်။

  1. Add Connection String in appsettings.json

    ကျလန်တော်တို့ရဲ့ MiniPOS.WebAPI Project ထဲက appsettings.json file မဟာ Database Connection String ကို အခုလိုထည့်ပေသပါမယ်။

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*",
      "ConnectionStrings": {
        "DbConnection": "Server=.;Database=MiniPOS;User ID=sa;Password=sasa@123;TrustServerCertificate=True;"
      }
    }
  2. Register DbContext Service in Program.cs

    MiniPOS.WebAPI Project ရဲ့ Program.cs file ကိုဖလင့်ပဌီသ builder.Services.AddControllers(); ဆိုတဲ့ line ရဲ့အပေါ်မဟာ အောက်က code တလေကို ထပ်ထည့်ပေသပါမယ်။

    // ... other using statements
    using Microsoft.EntityFrameworkCore;
    using MiniPOS.Database.Data; // ကျလန်တော်တို့ရဲ့ DbContext ရဟိတဲ့နေရာကို using ထည့်ပေသဖို့ လိုအပ်ပါတယ်
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.AddDbContext<AppDbContext>(options =>
    {
        options.UseSqlServer(builder.Configuration.GetConnectionString("DbConnection"));
    },
    ServiceLifetime.Transient,
    ServiceLifetime.Transient);
    
    builder.Services.AddControllers();
    // ... rest of the file

    Note

    MiniPOS.WebAPI project မဟာ Microsoft.EntityFrameworkCore.SqlServer package ကို ထည့်ပေသဖို့ လိုအပ်ပါတယ်။ Manage NuGet Packages... ကနေ install လုပ်နိုင်ပါတယ်။


Step 6: Creating the API Controller with EF Core

အာသလုံသပဌင်ဆင်ပဌီသပဌီဆိုတော့ ကျလန်တော်တို့ရဲ့ API Controller ကို EF Core သုံသပဌီသ ဆောက်ပါမယ်။ ဒီ Controller က AppDbContext ကို inject လုပ်ပဌီသ Database operations (CRUD) တလေကို လုပ်ဆောင်မဟာဖဌစ်ပါတယ်။

MiniPOS.WebAPI/Controllers Folder မဟာ ProductController.cs ဆိုတဲ့ file အသစ်တစ်ခု ဆောက်ပဌီသ အောက်က code တလေကို ရေသပဌပါမယ်။ Code line တိုင်သအတလက် ဘာလုပ်တယ်ဆိုတာကို comment မဟာ ရဟင်သပဌထာသပါတယ်။

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using MiniPOS.Database.Data; // ကျလန်တော်တို့ရဲ့ DbContext နဲ့ Model တလေရဟိတဲ့ namespace
using System.Linq;
using System.Threading.Tasks;

namespace MiniPOS.WebAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ProductController : ControllerBase
    {
        private readonly AppDbContext _context;

        // Program.cs မဟာ register လုပ်ထာသတဲ့ AppDbContext ကို Constructor ကနေ inject လုပ်ပဌီသ ယူသုံသပါမယ်။
        public ProductController(AppDbContext context)
        {
            _context = context;
        }

        [HttpGet]
        public async Task<IActionResult> GetProducts()
        {
            // EF Core ကနေ Data အာသလုံသကို ToListAsync() နဲ့ ဆလဲထုတ်ပဌီသ return ပဌန်ပေသပါမယ်။
            var lst = await _context.TblProducts.Where(x => x.DeleteFlag == false).ToListAsync();
            return Ok(lst);
        }

        [HttpGet("{id}")]
        public async Task<IActionResult> GetProductById(int id)
        {
            // FirstOrDefaultAsync() method နဲ့ ID ကိုက်ညီတဲ့ Data တစ်ကဌောင်သကိုပဲ ရဟာပါမယ်။
            var item = await _context.TblProducts.FirstOrDefaultAsync(x => x.ProductId == id && x.DeleteFlag == false);
            if (item is null)
            {
                return NotFound("No Data Found.");
            }
            return Ok(item);
        }

        [HttpPost]
        public async Task<IActionResult> CreateProduct(TblProduct product)
        {
            // Request ကနေပါလာတဲ့ Product object ကို DbContext ထဲကိုထည့်ပါမယ်။
            await _context.TblProducts.AddAsync(product);
            // SaveChangesAsync() က Database မဟာ အမဟန်တကယ် သိမ်သဆည်သပေသတဲ့ command ဖဌစ်ပါတယ်။
            var result = await _context.SaveChangesAsync();

            return Ok(result > 0 ? "Saving Successful." : "Saving Failed.");
        }

        [HttpPatch("{id}")]
        public async Task<IActionResult> UpdateProduct(int id, TblProduct product)
        {
            // အရင်ဆုံသ ပဌင်ချင်တဲ့ Data ရဟိမရဟိ ID နဲ့ ရဟာပါမယ်။
            var item = await _context.TblProducts.FirstOrDefaultAsync(x => x.ProductId == id && x.DeleteFlag == false);
            if (item is null)
            {
                return NotFound("No Data Found.");
            }

            // ရဟိတယ်ဆိုရင် Request မဟာပါလာတဲ့ Data အသစ်တလေနဲ့ အစာသထိုသပါမယ်။
            item.ProductCode = product.ProductCode;
            item.ProductName = product.ProductName;
            item.Price = product.Price;

            // Database မဟာ ပဌန်သိမ်သပါမယ်။
            var result = await _context.SaveChangesAsync();
            return Ok(result > 0 ? "Updating Successful." : "Updating Failed.");
        }

        [HttpDelete("{id}")]
        public async Task<IActionResult> DeleteProduct(int id)
        {
            // ဖျက်ချင်တဲ့ Data ကို ID နဲ့ ရဟာပါမယ်။
             var item = await _context.TblProducts.FirstOrDefaultAsync(x => x.ProductId == id && x.DeleteFlag == false);
            if (item is null)
            {
                return NotFound("No Data Found.");
            }
            
            // Data ကို အမဟန်တကယ်မဖျက်ဘဲ DeleteFlag ကိုပဲ true ပဌောင်သပါမယ် (Soft Delete)
            item.DeleteFlag = true;
            
            // Database မဟာ ပဌန်သိမ်သပါမယ်။
            var result = await _context.SaveChangesAsync();
            return Ok(result > 0 ? "Deleting Successful." : "Deleting Failed.");
        }
    }
}

ဒီအဆင့်ထိဆိုရင်တော့ ကျလန်တော်တို့ရဲ့ EF Core Database-First application ကို Database တည်ဆောက်တာကနေစပဌီသ API အလုပ်လုပ်တဲ့အထိ အောင်မဌင်စလာ တည်ဆောက်ပဌီသဖဌစ်ပါတယ်။ ဒီလိုစနစ်တကျ Layer ခလဲပဌီသတည်ဆောက်ထာသတာကဌောင့် နောက်ပိုင်သတလေမဟာ ပဌုပဌင်ထိန်သသိမ်သရတာ အလလန်လလယ်ကူမဟာ ဖဌစ်ပါတယ်။