হ্যালো হাসিব! আমরা EF Core-এর একটি অত্যন্ত পাওয়ারফুল ফিচার Fluent API নিয়ে কথা বলবো এই লেকচারে।
ডাটাবেস ডিজাইনে পারফরম্যান্স অপটিমাইজেশনের ক্ষেত্রে Model Class-এ শুধু প্রপার্টি ডিক্লেয়ার করলেই হয় না, তার ডেটা টাইপ, সাইজ, এবং ডিফল্ট ভ্যালু খুব সতর্কতার সাথে কন্ট্রোল করতে হয়। এই কাজগুলোই আমরা Fluent API দিয়ে করে থাকি।
যেহেতু তুমি .NET CLI এবং লিনাক্স ব্যবহার করো, আমি সে অনুযায়ী তোমাকে গাইড করছি। চলো প্রথমে লেকচারটির একটি কুইক সামারি দেখে নিই।
📝 Lecture Summary at a Glance
- The Problem with
nvarchar(max): C#-এরstringটাইপ বাই ডিফল্ট SQL Server-এnvarchar(max)হিসেবে তৈরি হয়। এটি ইউনিকোড সাপোর্ট করে এবং প্রতি ক্যারেক্টারের জন্য ২ বাইট জায়গা নেয়, যা বড় ডাটাবেসের পারফরম্যান্স ও স্টোরেজের জন্য ক্ষতিকর (যদি ইউনিকোডের দরকার না থাকে)। - Fluent API Introduction:
OnModelCreatingমেথডের ভেতরেModelBuilderব্যবহার করে টেবিলের নাম, কলামের নাম, ডেটা টাইপ এবং কনস্ট্রেইন্ট স্পেসিফাই করার পদ্ধতিকেই Fluent API বলে। - Column Configuration:
HasColumnName(),HasColumnType(), এবংHasDefaultValue()মেথডগুলো ব্যবহার করে কলামকে কাস্টমাইজ করা যায়। - Migration for Updates: Fluent API-তে কোনো পরিবর্তন করার পর অবশ্যই
dotnet ef migrations addএবংdatabase updateরান করে ডাটাবেসকে সিঙ্ক করতে হয়।
🧠 Comprehensive Breakdown & Deep Dive
১. The nvarchar(max) Problem and The “Why” [Importance: 9/10]
- The “Why”: লেকচারার বলেছেন
TIN(Tax Identification Number) কলামটির কথা। সাধারণত TIN-এ শুধু ইংরেজি অক্ষর ও সংখ্যা (Alphanumeric) থাকে, কোনো বাংলা বা চাইনিজ ক্যারেক্টার থাকে না। - Cost of Ignorance: তুমি যদি একে
nvarchar(max)হিসেবে রেখে দাও, তবে প্রতিটি ক্যারেক্টার মেমোরিতে দ্বিগুণ জায়গা নেবে (২ বাইট) এবং SQL Server-এর ইনডেক্সিং (Indexing) কাজ করবে না। তাই একেvarchar(8)বা নির্দিষ্ট সাইজে নামিয়ে আনাটা একজন ভালো সফটওয়্যার ইঞ্জিনিয়ারের দায়িত্ব।
২. Fluent API দিয়ে Column Configuration [Importance: 10/10]
- The “Why”: Data Annotations (যেমন
[Column],[StringLength]) দিয়ে এই কাজগুলো করা যায়, কিন্তু সেটি Model Class-কে নোংরা করে ফেলে। Clean Architecture-এ Model Class-কে যথাসম্ভব ক্লিন রাখা হয় এবং সব ডাটাবেস কনফিগারেশন Fluent API-এর মাধ্যমেOnModelCreating-এ করা হয়।
💻 Code Implementation (.NET 8/10 Standard):
তোমার PersonsDbContext.cs ফাইলে OnModelCreating মেথডে নিচের মতো করে TIN কলামটি কনফিগার করবে:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Fluent API Configuration for Person Entity
modelBuilder.Entity<Person>(entity =>
{
// টেবিলের নাম কনফিগার
entity.ToTable("Persons");
// TIN প্রপার্টির জন্য কাস্টম কলাম কনফিগারেশন
entity.Property(p => p.TIN)
.HasColumnName("TaxIdentificationNumber") // কলামের রিয়েল নাম
.HasColumnType("varchar(8)") // nvarchar এর বদলে varchar এবং সাইজ ৮
.HasDefaultValue("ABC12345"); // ডিফল্ট ভ্যালু
});
// Seed Data...
}
(লক্ষ্য করো, আমি modelBuilder.Entity<Person>().Property(...) বারবার না লিখে entity => {} ব্লক ব্যবহার করেছি। এটি আধুনিক C#-এ অনেক বেশি রিডেবল ও ক্লিন প্র্যাকটিস।)
৩. Apply Changes using Migration (CLI) [Importance: 9/10]
Fluent API-তে পরিবর্তন করার পর ডাটাবেসকে জানাতে হবে যে কলামের নাম ও টাইপ চেঞ্জ হয়েছে।
💻 Linux / VS Code Terminal Command:
# ১. মাইগ্রেশন তৈরি করা (যা কলামের নাম এবং টাইপ আপডেট করবে)
dotnet ef migrations add UpdateTINColumn --project Entities --startup-project CrudExample
# ২. ডাটাবেসে পুশ করা
dotnet ef database update --project Entities --startup-project CrudExample
এই কমান্ডগুলো রান করলে EF Core ইন্টারনালি sp_rename ব্যবহার করে কলামের নাম পরিবর্তন করবে এবং ALTER TABLE দিয়ে ডাটা টাইপ আপডেট করবে।
🚀 Advanced Best Practices & .NET 10 Features
১. Separation of Configuration (IEntityTypeConfiguration):
তোমার প্রজেক্ট (যেমন Chatrabash) যখন বড় হবে, তখন OnModelCreating মেথডটি শত শত লাইনের Fluent API কোডে ভরে যাবে, যা মেইনটেইন করা অসম্ভব। এর স্মার্ট সল্যুশন হলো প্রতিটি Model-এর জন্য আলাদা Configuration ক্লাস তৈরি করা।
💻 Pro Tip Implementation:
একটি নতুন ক্লাস তৈরি করো PersonConfiguration.cs:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
public class PersonConfiguration : IEntityTypeConfiguration<Person>
{
public void Configure(EntityTypeBuilder<Person> builder)
{
builder.ToTable("Persons");
builder.Property(p => p.TIN)
.HasColumnName("TaxIdentificationNumber")
.HasColumnType("varchar(8)")
.HasDefaultValue("ABC12345");
// অন্যান্য কলামের কনফিগারেশন এখানে থাকবে...
}
}
এরপর তোমার DbContext-এর OnModelCreating মেথডে শুধু এক লাইনে সব কনফিগারেশন লোড করে নাও:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// এটি তোমার অ্যাসেম্বলির সব IEntityTypeConfiguration ক্লাস খুঁজে নিজে থেকেই অ্যাপ্লাই করবে!
modelBuilder.ApplyConfigurationsFromAssembly(typeof(PersonsDbContext).Assembly);
}
এটি ইন্ডাস্ট্রির সবচেয়ে বেস্ট প্র্যাকটিস এবং ক্লিন আর্কিটেকচারের সাথে মানানসই।
২. Schema Management:
লেকচারার HasDefaultSchema("YourSchema") এর কথা উল্লেখ করেছেন। যদি তোমার প্রজেক্টে মাল্টিপল মডিউল থাকে (যেমন: Admin, User, Payment), তবে তুমি টেবিলগুলোকে আলাদা স্কিমায় ভাগ করতে পারো (admin.Users, payment.Transactions)। এটি ডাটাবেসকে অনেক অর্গানাইজড রাখে।
পরবর্তী লেকচারে Fluent API-এর আরও কিছু কনস্ট্রেইন্ট (Constraints) নিয়ে আলোচনা হওয়ার কথা। তুমি রেডি হলে পরের ট্রান্সক্রিপ্টটি দিতে পারো!