চমৎকার! আগের লেকচারগুলোতে আমরা Web API প্রজেক্ট সেটআপ এবং Controller-এর বেসিক শিখেছি। আজ আমরা শিখবো কীভাবে আমাদের Web API-কে ডাটাবেজের সাথে কানেক্ট করা যায়। আপনি এখন আছেন Lecture 358: EntityFrameworkCore with Web API-তে। আজ আমরা Entity Framework Core (EF Core) ব্যবহার করে একটি Database তৈরি করবো এবং তাতে কিছু ডামি ডেটা (Seed Data) রাখবো।

চলুন শুরু করা যাক!


📝 Lecture Summary

ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল কাজগুলো নিচে তালিকাভুক্ত করা হলো:

  • Install Packages: EF Core নিয়ে কাজ করার জন্য Microsoft.EntityFrameworkCore.SqlServer এবং Microsoft.EntityFrameworkCore.Tools NuGet package ইনস্টল করতে হবে।
  • Create Model: ডাটাবেজ টেবিলের ব্লুপ্রিন্ট হিসেবে City Model Class তৈরি করা।
  • Setup DbContext: DbContext ক্লাস থেকে ইনহেরিট করে ApplicationDbContext তৈরি করা এবং এতে DbSet অ্যাড করা।
  • Seed Data: OnModelCreating মেথড ওভাররাইড করে টেবিল তৈরির সময়ই কিছু ডিফল্ট ডেটা (Seed Data) ইনসার্ট করার ব্যবস্থা করা।
  • Connection String: appsettings.json ফাইলে SQL Server-এর Connection String যুক্ত করা।
  • Service Registration: Program.cs ফাইলে ApplicationDbContext-কে সার্ভিস হিসেবে যুক্ত করা।
  • Migrations: Database তৈরি করার জন্য add-migration এবং update-database কমান্ড রান করা।

🧠 Comprehensive Breakdown

নিচে লেকচারের প্রতিটি কনসেপ্ট বিস্তারিত এবং সহজভাবে ব্যাখ্যা করা হলো।

১. EF Core Packages Installation (Importance: 10/10)

যেকোনো .NET অ্যাপ্লিকেশনে ডাটাবেজ নিয়ে কাজ করার জন্য Entity Framework Core সবচেয়ে জনপ্রিয় টুল। Web API-তে এটি ব্যবহার করার জন্য প্রথমে দুটি Package ইনস্টল করতে হবে।

Why? * Microsoft.EntityFrameworkCore.SqlServer: এটি আমাদের অ্যাপ্লিকেশনকে Microsoft SQL Server-এর সাথে কথা বলতে সাহায্য করে।

  • Microsoft.EntityFrameworkCore.Tools: এটি ইনস্টল করলে আমরা Package Manager Console-এ Migration কমান্ড (যেমন: ডাটাবেজ আপডেট করা) ব্যবহার করতে পারি।

২. Creating the Model Class (Importance: 9/10)

আমাদের ডাটাবেজে একটি Cities টেবিল থাকবে। এর জন্য একটি City নামের Model Class বানাতে হবে।

Why GUID instead of INT? ভিডিওতে CityID এর ডেটা টাইপ int এর বদলে Guid (Globally Unique Identifier) ব্যবহার করা হয়েছে। কারণ int বা long এর একটি নির্দিষ্ট রেঞ্জ (limit) থাকে, কিন্তু Guid ব্যবহার করলে আপনি আনলিমিটেড ইউনিক আইডি জেনারেট করতে পারবেন এবং ডিস্ট্রিবিউটেড সিস্টেমে এটি অনেক বেশি নিরাপদ।

using System.ComponentModel.DataAnnotations;
 
namespace CitiesManager.WebApi.Models
{
    public class City
    {
        [Key] // এটি CityID-কে Primary Key হিসেবে সেট করবে
        public Guid CityID { get; set; }
        
        public string? CityName { get; set; }
    }
}
 

৩. Setting up the DbContext (Importance: 10/10)

EF Core-এ DbContext ক্লাসটি ডাটাবেজ সেশন হিসেবে কাজ করে। আমরা ApplicationDbContext নামে একটি ক্লাস বানাবো।

Why Constructors? এখানে আমরা দুটি Constructor ব্যবহার করেছি। একটি প্যারামিটারলেস (Optional) এবং অন্যটি DbContextOptions রিসিভ করে। Program.cs থেকে ডাটাবেজের কনফিগারেশন (যেমন Connection String) এই অপশনের মাধ্যমেই ইনজেক্ট করা হয়।

৪. Seeding Data with OnModelCreating (Importance: 8/10)

ডাটাবেজ তৈরি হওয়ার সময়ই যেন কিছু ডিফল্ট রেকর্ড (যেমন: ২-৩টি শহরের নাম) টেবিলে সেভ হয়ে যায়, সেটিকে Seed Data বলে। এর জন্য OnModelCreating মেথড ওভাররাইড করতে হয়।

💡 VS Code Shortcut for GUID: > লেকচারে Visual Studio-তে “Tools > Create GUID” ব্যবহার করে GUID জেনারেট করা হয়েছে। আপনি যদি Visual Studio Code ব্যবহার করেন, তবে এক্সটেনশন ট্যাব থেকে “Insert GUID” নামের একটি এক্সটেনশন ইনস্টল করে নিতে পারেন। এরপর কোড এডিটরে F1 চেপে “Insert GUID” সিলেক্ট করলেই অটোমেটিক একটি GUID পেস্ট হয়ে যাবে।

using CitiesManager.WebApi.Models;
using Microsoft.EntityFrameworkCore;
 
namespace CitiesManager.WebApi.DatabaseContext
{
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions options) : base(options) { }
        public ApplicationDbContext() { }
 
        public DbSet<City> Cities { get; set; }
 
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
 
            // Seed Data তৈরি করা
            modelBuilder.Entity<City>().HasData(
                new City { CityID = Guid.Parse("E59A5A4A-78D7-4B52-8706-93273DDBB98D"), CityName = "New York" },
                new City { CityID = Guid.Parse("8885BCA5-06B6-4EBB-95D0-E0D571DAEFE3"), CityName = "London" }
            );
        }
    }
}
 

৫. Connection String Configuration (Importance: 10/10)

ডাটাবেজ কোথায় আছে এবং তার নাম কী, তা অ্যাপ্লিকেশনকে জানাতে হবে। এটি appsettings.json ফাইলে লেখা হয়।

"ConnectionStrings": {
  "Default": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=CitiesDatabase;Integrated Security=True"
}
 

৬. Service Registration in Program.cs (Importance: 10/10)

আমাদের তৈরি করা ApplicationDbContext-কে সার্ভার রান হওয়ার সময় মেমোরিতে লোড করতে হবে।

.NET 10 Updated Smart Approach: বর্তমান .NET ভার্সনগুলোতে Program.cs অনেক ক্লিন। এখানে সরাসরি builder.Configuration ব্যবহার করে Connection String রিড করে AddDbContext সার্ভিস যুক্ত করা হয়।

using CitiesManager.WebApi.DatabaseContext;
using Microsoft.EntityFrameworkCore;
 
var builder = WebApplication.CreateBuilder(args);
 
// DbContext কনফিগার করা এবং Connection String যুক্ত করা
builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("Default"));
});
 
builder.Services.AddControllers();
var app = builder.Build();
 
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
 

৭. EF Core Migrations (Importance: 10/10)

সব কোড লেখা শেষ হলে ডাটাবেজ ফিজিক্যালি তৈরি করার পালা।

🖥️ CLI Commands for VS Code: ভিডিওতে Visual Studio-এর Package Manager Console ব্যবহার করা হয়েছে (Add-Migration Initial এবং Update-Database)। আপনি যদি VS Code ব্যবহার করেন, তবে Terminal-এ নিচের কমান্ডগুলো রান করবেন:

  1. dotnet ef migrations add Initial

  2. dotnet ef database update


🏆 Best Practices for EF Core in Web API

  • Protect Connection Strings: প্রোডাকশন লেভেলে কখনোই appsettings.json এ সরাসরি আসল পাসওয়ার্ড বা সিক্রেট Connection String রাখবেন না। এর বদলে Azure Key Vault বা .NET Secrets Manager ব্যবহার করা বেস্ট প্র্যাকটিস।

  • Use AsNoTracking() for GET Requests: Web API-তে যখন আপনি শুধু Data রিড করে ক্লায়েন্টকে পাঠাবেন (যেমন GET মেথডে), তখন EF Core কোয়েরিতে .AsNoTracking() ব্যবহার করবেন। এটি ಮೆমোরি বাঁচায় এবং পারফরম্যান্স অনেক ফাস্ট করে।

  • Example: var cities = await _context.Cities.AsNoTracking().ToListAsync();

  • Dependency Injection: DbContext-কে সবসময় DI (Dependency Injection) এর মাধ্যমে কন্ট্রোলারে আনবেন, নিজে কখনো new ApplicationDbContext() করে অবজেক্ট বানাবেন না। builder.Services.AddDbContext বাই-ডিফল্ট এটিকে Scoped সার্ভিস হিসেবে মেমোরিতে রাখে যা Web API এর জন্য পারফেক্ট।