হ্যালো হাসিব! EF Core-এর বেসিক পরিচিতির পর আমরা এখন এর আর্কিটেকচারাল অ্যাপ্রোচগুলো নিয়ে কথা বলবো। Outline অনুযায়ী এই টপিকটি ‘Introduction to EntityFrameworkCore’ এর ঠিক পরে এবং ‘DbContext and DbSet’ এর আগের ধাপ। তাই তুমি কোডে হাত দেওয়ার আগে এই কনসেপ্টটি একদম ক্লিয়ার রাখা খুব জরুরি।
তোমার প্রজেক্ট বা SaaS ডেভেলপমেন্টের ক্ষেত্রে ডাটাবেস ডিজাইন কীভাবে হ্যান্ডেল করবে, তার একটি বড় গাইডলাইন এই লেকচারে রয়েছে। চলো লেকচারটির সম্পূর্ণ পোস্টমর্টেম করে ফেলি।
📝 Lecture Summary at a Glance
- Two Approaches: EF Core প্রধানত দুটি অ্যাপ্রোচ সাপোর্ট করে— Database-First এবং Code-First।
- Database-First Approach: আগে ডাটাবেস এবং টেবিল তৈরি করা হয় (SQL দিয়ে), তারপর সেই ডাটাবেস থেকে C# Model Class জেনারেট করা হয়। এটি লিগ্যাসি (পুরনো) বা এক্সিস্টিং ডাটাবেসের জন্য ভালো।
- Code-First Approach: আগে C# Model Class তৈরি করা হয়, এরপর EF Core-এর Migrations কমান্ড ব্যবহার করে স্বয়ংক্রিয়ভাবে ডাটাবেস এবং টেবিল তৈরি করা হয়। নতুন প্রজেক্টের জন্য এটি সবচেয়ে জনপ্রিয়।
- Handling Changes: Database-First এ ডাটাবেস মডিফাই করতে সরাসরি SQL স্ক্রিপ্ট লিখতে হয়। Code-First এ C# ক্লাসে প্রপার্টি অ্যাড বা রিমুভ করে Migration রান করতে হয়।
- Database Objects: Stored Procedures বা Triggers-এর ক্ষেত্রে Database-First বেশ স্বাধীন, তবে Code-First-এ এগুলো Migration-এর মাধ্যমে হ্যান্ডেল করতে হয়।
🧠 Comprehensive Breakdown & Deep Dive
১. Database-First Approach [Importance: 6/10]
- The “Why”: ধরো তুমি এমন একটি প্রজেক্টে কাজ করছো যেখানে আগে থেকেই একটি বিশাল ডাটাবেস তৈরি করা আছে (হতে পারে অন্য কোনো ল্যাঙ্গুয়েজের প্রজেক্ট থেকে তুমি .NET-এ শিফট করছো), অথবা টিমে আলাদা Database Administrator (DBA) আছেন যিনি ডাটাবেস ডিজাইন করেন। এসব ক্ষেত্রে তোমার C# কোড থেকে নতুন করে ডাটাবেস বানানোর দরকার নেই। বিদ্যমান ডাটাবেস থেকেই Model ক্লাসগুলো তৈরি করে নেওয়া হলো Database-First অ্যাপ্রোচ।
- কীভাবে কাজ করে: ডাটাবেসে কোনো কলাম অ্যাড করতে হলে তোমাকে সরাসরি SQL কুয়েরি (যেমন
ALTER TABLE) চালাতে হবে। এরপর মডেল ক্লাসগুলো আবার আপডেট (Scaffold) করে নিতে হবে।
💻 Modern .NET CLI Implementation (For Linux/Cross-platform):
যেহেতু তুমি Windows-এর Visual Studio-এর বদলে Linux বা অন্যান্য এনভায়রনমেন্টে কাজ করতে স্বাচ্ছন্দ্যবোধ করো, তাই Package Manager Console-এর বদলে সবসময় .NET CLI ব্যবহার করবে।
Database-First এর ক্ষেত্রে ডাটাবেস থেকে C# ক্লাস জেনারেট করার কমান্ড:
dotnet ef dbcontext scaffold "Your_Connection_String" Microsoft.EntityFrameworkCore.SqlServer -o Models
(এই কমান্ডটি ডাটাবেস রিড করে ‘Models’ ফোল্ডারে সব C# ক্লাস অটোমেটিক বানিয়ে দেবে।)
২. Code-First Approach [Importance: 10/10]
- The “Why”: তুমি যখন একদম স্ক্র্যাচ থেকে একটি নতুন প্রোজেক্ট বা SaaS বানাচ্ছো, তখন ডাটাবেস নিয়ে আলাদাভাবে চিন্তা না করে পুরো ফোকাস C# কোডে রাখার জন্যই Code-First ব্যবহার করা হয়। এখানে তোমার Model Class-ই হলো ডাটাবেসের ব্লু-প্রিন্ট।
- কীভাবে কাজ করে: তুমি তোমার C# ক্লাসে নতুন একটি Property যোগ করবে, এরপর Migration কমান্ড চালাবে। EF Core নিজে থেকেই বুঝতে পারবে যে টেবিলে নতুন একটি কলাম যোগ করতে হবে এবং সে অনুযায়ী ডাটাবেস আপডেট করে নেবে।
💻 Code Implementation:
ধরো, তোমার Hostel টেবিলে একটি নতুন কলাম Capacity দরকার।
public class Hostel
{
public int Id { get; set; }
public string Name { get; set; }
// নতুন Property অ্যাড করলাম
public int Capacity { get; set; }
}
এরপর টার্মিনালে এই কমান্ড দুটি চালালেই ডাটাবেস আপডেট হয়ে যাবে:
# ১. Migration তৈরি করা (কোডের পরিবর্তনগুলো রেকর্ড করা)
dotnet ef migrations add AddedHostelCapacity
# ২. ডাটাবেসে পরিবর্তনগুলো অ্যাপ্লাই করা
dotnet ef database update
৩. The Reality Check: Code-First vs DB-First in .NET 10 [Importance: 9/10]
- Lecturer’s View: লেকচারার বলেছেন Code-First ছোট বা প্রোটোটাইপ লেভেলের অ্যাপ্লিকেশনের জন্য ভালো, এবং অ্যাপ্লিকেশন বড় হলে DB-First এ শিফট করা উচিত।
- Modern Update & Reality: হাসিব, এখানে একটি বড় Misconception আছে যা পুরনো EF ভার্সনগুলোর কারণে তৈরি হয়েছিল। .NET 8/10 এর বর্তমান যুগে Code-First ই হলো ইন্ডাস্ট্রি স্ট্যান্ডার্ড, এমনকি এন্টারপ্রাইজ লেভেলের বিশাল অ্যাপ্লিকেশনের জন্যও। Code-First এর সবচেয়ে বড় সুবিধা হলো Version Control। তুমি Git-এ তোমার C# কোড পুশ করার সাথে সাথে তোমার ডাটাবেসের স্কিমা (Schema) হিস্ট্রিও পুশ হচ্ছে। টিমের অন্য ডেভেলপাররা (যেমন ফ্রন্টএন্ড বা QA টিম যারা তোমার API টেস্ট করবে) কোড পুল করে শুধু
dotnet ef database updateদিলেই তাদের লোকাল মেশিনেও ডাটাবেস তোমার ডাটাবেসের সাথে সিঙ্ক হয়ে যাবে। মাল্টি-ট্যানেন্ট আর্কিটেকচার বা বড় সিস্টেমে সরাসরি SQL ডাটাবেসে হাত দেওয়ার চেয়ে Code-First Migration অনেক বেশি নিরাপদ এবং গোছানো।
৪. Custom Database Objects (Stored Procedures / Views) [Importance: 5/10]
- The “Why”: অনেক সময় পারফরম্যান্সের জন্য ডাটাবেসে Stored Procedure বা View দরকার হয়। DB-First-এ এগুলো সরাসরি ডাটাবেসে SQL দিয়ে লেখা যায়। Code-First-এ এগুলো Migration ফাইলের ভেতরে Raw SQL হিসেবে লিখতে হয়।
// Code-First Migration ফাইলে Stored Procedure অ্যাড করার নিয়ম:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(@"
CREATE PROCEDURE GetActiveUsers
AS
BEGIN
SELECT * FROM Users WHERE IsActive = 1
END");
}
🚀 Best Practices for EF Core Approaches
১. Code-First কে ডিফল্ট হিসেবে ধরা: নতুন যেকোনো প্রজেক্টে সবসময় Code-First এবং Migrations ব্যবহার করবে। এতে তোমার ডাটাবেসের বিবর্তন (evolution) ট্র্যাক করা সহজ হবে।
২. Descriptive Migration Names:
Migration তৈরি করার সময় নামগুলো সবসময় অর্থবহ দেবে। যেমন סתם Migration1, Update2 না দিয়ে, AddedUserEmailColumn বা CreatedPaymentTable ব্যবহার করবে। এতে পরবর্তীতে হিস্ট্রি বুঝতে সুবিধা হয়।
৩. Never Modify Auto-Generated Migration Files (Unless Necessary): EF Core যে Migration ফাইলগুলো জেনারেট করে, সেগুলোতে ম্যানুয়ালি কোনো পরিবর্তন না করাই ভালো (যদি না তুমি Stored Procedure বা Seed Data ইনজেক্ট করতে চাও)।
💡 Pro Tip (VS Code / CLI Shortcuts):
লিনাক্স টার্মিনাল বা VS Code-এ কাজ করার সময় বারবার বড় কমান্ড না লিখে তুমি .bashrc বা .zshrc ফাইলে alias তৈরি করে রাখতে পারো।
যেমন:
alias efadd="dotnet ef migrations add"
alias efup="dotnet ef database update"
এতে কাজ অনেক দ্রুত হবে! কোড লেখার সময় ctor লিখে Tab চাপলে Constructor এবং prop লিখে Tab চাপলে Property তৈরি হওয়ার শর্টকাটগুলো তো আছেই।